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
    评论
根据引用\[1\],可以使用暴力解法来求解滑动窗口最大值。具体的做法是,遍历数组,对于每个窗口,使用一个内部循环来找到窗口中的最大值,并将其存储在结果数组中。时间复杂度为O(n*k),其中n为数组长度,k为窗口大小。 根据引用\[2\],还可以使用队列来求解滑动窗口最大值。具体的做法是,使用一个双端队列来维护一个单调递减的窗口。遍历数组,对于每个元素,首先判断队头是否在滑动窗口范围内,如果不在,则将其从队头移除。然后,将当前元素与队尾元素比较,如果当前元素大于队尾元素,则将队尾元素移除,直到队列为空或者当前元素小于等于队尾元素。最后,将当前元素的索引插入队尾。如果滑动窗口的元素个数达到了k个,并且始终维持在窗口中,就将队头元素加入答案数组中。时间复杂度为O(n),其中n为数组长度。 综上所述,可以使用暴力解法或者使用队列来求解leetcode滑动窗口最大值。 #### 引用[.reference_title] - *1* *3* [leetcode239. 滑动窗口最大值](https://blog.csdn.net/kkkkuuga/article/details/124829581)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Leetcode#239. 滑动窗口最大值 (Java解法)](https://blog.csdn.net/paranior/article/details/114890555)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值