题解 | #滑动窗口的最大值#

【模板】堆

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

import java.util.*;
class Heap{
    private int[] array; //开辟一个数组保存堆
    private int length;  // 记录堆的实际长度(非常必要),可以节省出堆的操作。
    Heap(int n){
        array = new int[n];
        length = 0;
    }
    public void push(int x){
        //将新添加的元素放置到最后。
        array[length++] = x;
        //此时调整最后一个子节点所在的子树,可以自己画棵树推一下
        for(int i = length / 2 - 1; i >= 0; i = (i - 1) / 2){
            adjustHeap(i);
            //这里是由于(i-1)/2取下整,当i=0会出现死循环
            if(i == 0){
                break;
            }
        }
    }
    
    public void pop(){
        if(length > 0){
            System.out.println(array[0]);
            array[0] = array[length - 1];
            length--;
            adjustHeap(0);
        }else{
            System.out.println("empty");
        }
    }
    //这个方法无需多说
    public void top(){
        if(length <= 0)
            System.out.println("empty");
        else{
            System.out.println(array[0]);
        }
    }
    private void adjustHeap(int i){
        int temp = array[i];
        for(int k = 2 * i + 1; k < length; k = 2 * k + 1){
            //判断左孩子大还是右孩子大
            if( k + 1 < length && array[k+1] > array[k])
                k++;
            //如果存在子树比当前节点大
            if(array[k] > temp){
                //将大的数据赋给当前节点
                array[i] = array[k];
                //调整赋值的子树
                i = k;
            }else{
                break;
            }
        }
        array[i] = temp;
    }
}
public class Main{
    public static void main(String... args){
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        Heap heap = new Heap(n);
        scan.nextLine();
        for(int i = 1; i <= n; i++){
            String s = scan.nextLine();
            String[] action = s.split(" ");
            if(action[0].equals("push")){
                heap.push(Integer.parseInt(action[1]));
            }else if(action[0].equals("pop")){
                heap.pop();
            }else if(action[0].equals("top")){
                heap.top();
            }
        }
    }
}
全部评论
为什么这个会在堆的题里面?
点赞 回复 分享
发布于 2024-08-01 19:02 广东

相关推荐

评论
2
1
分享

创作者周榜

更多
牛客网
牛客企业服务