题解 | #【模板】堆#

【模板】堆

https://www.nowcoder.com/practice/13f61c8c92404f5ea5d6fa4c692869fb

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    private static final StringBuilder sb = new StringBuilder();

    static class Heap {
        // 记录堆的实际长度,可以节省出堆的操作。
        private int size;
        private final ArrayList<Integer> list;

        public Heap() {
            //利用动态数组存储堆
            list = new ArrayList<>();
            size = 0;
        }

        public void push(int x) {
            //添加新元素到最后
            list.add(x);
            size++;
            //从最后一个非叶子结点开始向上调整
            for (int i = size / 2 - 1; i >= 0; i = (i - 1) / 2) {
                adjustHeap(i);
                //这里是由于(i-1)/2取下整,当i=0会出现死循环
                if (i == 0) break;
            }
        }

        public void pop() {
            if (size == 1) {
                int first = list.remove(0);
                sb.append(first).append("\n");
                size--;
            } else if (size > 1) {
                int last = list.get(size-1);
                int first = list.get(0);
                sb.append(first).append("\n");
                list.set(0, last);
                list.remove(size-1);
                size--;
                adjustHeap(0);
            } else {
                sb.append("empty").append("\n");
            }
        }

        public void top() {
            if (size <= 0) {
                sb.append("empty").append("\n");
            } else {
                sb.append(list.get(0)).append("\n");
            }
        }
        //向下调整
        private void adjustHeap(int i) {
            int temp = list.get(i);
            for (int k = 2 * i + 1; k < size; k = 2 * k + 1) {
                //取孩子中较大的与之比较
                if (k + 1 < size && list.get(k) < list.get(k + 1)) {
                    k++;
                }
                int larger = list.get(k);
                if (larger > temp) {
                    list.set(i, larger);
                    i = k;
                } else {
                    break;
                }
            }
            list.set(i, temp);
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(
            new InputStreamReader(System.in));
        int commandCount = Integer.parseInt(br.readLine());
        Heap heap = new Heap();
        for (int i = 0; i < commandCount; i++) {
            String[] array = br.readLine().split(" ");
            String command = array[0];
            if (command.equals("push")) {
                heap.push(Integer.parseInt(array[1]));
            } else if (command.equals("pop")) {
                heap.pop();
            } else if (command.equals("top")) {
                heap.top();
            }
        }
        System.out.println(sb);
    }
}

全部评论

相关推荐

中南民族大学的一名中南民族大学的学生:不敢睁开眼 希望是我的幻觉
点赞 评论 收藏
分享
02-05 08:49
已编辑
武汉大学 Java
野猪不是猪🐗:36k和36k之间亦有差距,ms的36k和pdd的36k不是一个概念
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务