【剑指 Offer】59 - I. 滑动窗口的最大值(详细解析)

第 46 日:I. 滑动窗口的最大值

题目链接:https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/

题目

image-20211129175105128

解题

  1. 双向队列

    解题思路:

    第一时间想到的是暴力破解,但是暴力破解肯定没前途啊,后面又思考了很久~~

    使用双向队列,来存放窗口中的值,并且时刻保证队列中最左端为窗口数的最大值;

    如何实现?:窗口每次向右移动,添加数值到队尾并且将队尾左侧小于该数值的数移除。

    这样就保证了,队列头时刻为窗口里的最大值!!

    但有些细节要注意,如果窗口为2,数组为5,1,2,3,4;这样的按上面算法,5在队列中一直不会过期。

    所以要设立一个窗口的左指针,移动后判断左指针的数是否和队列头的数相等,相等就设置过期。

    详细代码如下:

    class Solution {
        public int[] maxSlidingWindow(int[] nums, int k) {
            if (k==0||k==1) return nums;
            Deque<Integer> deque = new LinkedList<>();
            int[] res=new int[nums.length-k+1];
            int l=1-k,r=0;
            //形成窗口期
            for (;r<k;r++,l++){
                while(!deque.isEmpty()&&nums[r]>deque.getLast())
                    deque.removeLast();
                deque.add(nums[r]);
            }
            res[l-1]=deque.getFirst();
            //已形成
            for (;r<nums.length;r++,l++) {
                if (deque.getFirst()==nums[l-1])
                    deque.removeFirst();
                while(!deque.isEmpty()&&nums[r]>deque.getLast())
                    deque.removeLast();
                deque.add(nums[r]);
                res[l]=deque.getFirst();
            }
            return res;
        }
    }
    

    image-20211129175149077

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值