leetcode 面试题59 - II. 队列的最大值

方法1:

维护一个数组对数据尽心入队和出队,需要取最大值时, 遍历数组寻找最大值,时间复杂度不符合O(1)。

方法2:

维护两个数组,一个数组用于实现数据的入队和出队,零一个数组为单调递减数组,即数组的首个元素最大,当有新入队数据时,将递减数组中比新数据小的元素都出队(这些小数据并不会对求最大值产生影响),并将新数据入队。

class MaxQueue {
    //基础数组的初始化
        int[] arr ;
        int start = 0;
        int end = 0;
        //辅助数组的初始化
        //辅助数组是单调递减数组,
        int[] maxArr ;
        int maxhead = 0;
        int maxtail = 0;
    public MaxQueue() {
        arr = new int[10000];
        maxArr = new int[10000];
    }
    
    public int max_value() {
        if(start != end){
            return maxArr[maxhead];
        }
        return -1;
    }
    
    public void push_back(int value) {
        //数组末尾插入元素
        arr[end++] = value;
        //将辅助数组中所有比插入元素小的数都出列
        while(maxhead != maxtail && maxArr[maxtail-1] < value ){
            maxtail--;
        }
        maxArr[maxtail++] = value;
    }
    
    public int pop_front() {
        if(start == end)return -1;
        int value = arr[start++];
        //比较出列元素是否为辅助数组的首元素(最大值),若是,则将辅助数组的首元素出列
        if(maxArr[maxhead] == value){
            maxhead++;
        }
        return value;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值