力扣--滑动窗口最大值

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值 

示例 1:

输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置                最大值
---------------               -----
[1  3  -1] -3  5  3  6  7       3
 1 [3  -1  -3] 5  3  6  7       3
 1  3 [-1  -3  5] 3  6  7       5
 1  3  -1 [-3  5  3] 6  7       5
 1  3  -1  -3 [5  3  6] 7       6
 1  3  -1  -3  5 [3  6  7]      7

示例 2:

输入:nums = [1], k = 1
输出:[1]

提示:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104
  • 1 <= k <= nums.length

对于这道题目来说,最应该相到也是我觉得最容易看懂的就是双向队列来实现,首先要明确用队列来做的话,要想清楚一个思路,因为java没有函数可以直接实现查找k个数得最大值,所以要放入队列里面的话就必须吧其中最大的值放在显眼位置就例如队首或者队尾,既然这样如果把最大值放入队首了,那就和单调队列一个思路,如果后面插入的值小于队首就进入队列放在后面,如果进来的值大于队首,就取代他放到队首,此时从什么时候开始取最大值呢?就是当i>=k-1的时候,这里还有一个容易错的地方就是,此时还要判断队首的值什么时候出队列,因为这是一个滑动窗口,不可能你一开始的最大值在移动了几个后还在队列当中,所以此时还要判断当i<i-k+1的时候还要将队首元素pop出去,代码如下

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        ArrayDeque<Integer> deque = new ArrayDeque<>();
        int n = nums.length;
        int[] res = new int[n - k + 1];
        int idx = 0;
        for(int i = 0; i < n; i++) {
            // 1.队列头结点需要在[i - k + 1, i]范围内,不符合则要弹出
            while(!deque.isEmpty() && deque.peek() < i - k + 1){
                deque.poll();
            }
            // 2.既然是单调,就要保证每次放进去的数字要比末尾的都大,否则也弹出
            while(!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) {
                deque.pollLast();
            }

            deque.offer(i);

            // 因为单调,当i增长到符合第一个k范围的时候,每滑动一步都将队列头节点放入结果就行了
            if(i >= k - 1){
                res[idx++] = nums[deque.peek()];
            }
        }
        return res;
    }
}

相关推荐

  1. --滑动窗口

    2024-07-10 06:30:08       31 阅读
  2. [100] 10.滑动窗口

    2024-07-10 06:30:08       48 阅读
  3. 239. 滑动窗口

    2024-07-10 06:30:08       45 阅读
  4. 每日一题day25[239. 滑动窗口]

    2024-07-10 06:30:08       54 阅读
  5. 每日一题 --- 滑动窗口[][Go]

    2024-07-10 06:30:08       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 06:30:08       99 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 06:30:08       107 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 06:30:08       90 阅读
  4. Python语言-面向对象

    2024-07-10 06:30:08       98 阅读

热门阅读

  1. 后端开发常见错误

    2024-07-10 06:30:08       29 阅读
  2. DNS缓存详解

    2024-07-10 06:30:08       27 阅读
  3. Docker 的基本概念和优势

    2024-07-10 06:30:08       29 阅读
  4. Ubuntu 下 Docker安装 2024

    2024-07-10 06:30:08       31 阅读
  5. C#中序列化和反序列化

    2024-07-10 06:30:08       30 阅读
  6. 微服务节流阀:Eureka中服务限流策略的精妙实现

    2024-07-10 06:30:08       28 阅读