LeetCode-239-滑动窗口最大值

题目

在这里插入图片描述

思路

  1. API小能手表示可以先把第一个窗口加进去,然后加一个减一个用API求最大值即可。
  2. 然后就被卡时间了,果然不能取巧,想想有没有解决办法。
  3. 用一个双端队列存储数组的下标(为了方便取值)。
  4. 如果加入的数大于当前队首的值就弹出所有队列里的值且加入该数,如果大于队列中部分值,也弹出它们且加入该数,这样可以保证队列永远是从大到小排序的。
  5. 双端队列设立LR,首先令L=0,R增到规定的k后开始记录答案,每一次判断是否加入都要将L和R往后移一位,模拟窗口每次的滑动。
  6. 如果队首的下标值小于L的话,需要弹出队列里所有值,因为此时的“最大值”不在[L,R]范围内。

代码

    public int[] maxSlidingWindow(int[] nums, int k) {
        if(nums == null || nums.length<2) return nums;
        //创建双向队列
        LinkedList<Integer> queue = new LinkedList<>();
        //结果数组
        int[] result = new int[nums.length-k+1];
        //开始遍历 滑动窗口
        //其中i为R L因为从始至终和R都差着k个距离 可以默认为i-k
        for(int i=0;i<nums.length;i++){
            //需要从队列里弹出元素的情况:队列不为空 且传入的数大于队列中(部分也可以是全部)的数
            //将被比下去的数弹出
            while(!queue.isEmpty() && nums[queue.peekLast()]<=nums[i]){
                queue.pollLast();
            }
            //把当前数的下标加入
            queue.addLast(i);
            //判断当前队列中队首的值是否有效 当前窗口范围:[i-k+1,i]
            if(queue.peek() <= i-k) queue.poll();
            //如果窗口已经滑动到[0,k]了 则可以开始添加最大值ans
            if(i+1>=k) result[i+1-k]=nums[queue.peek()];
        }
        return result;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值