首页 > 其他分享 >239. 滑动窗口最大值

239. 滑动窗口最大值

时间:2022-11-16 21:00:33浏览次数:79  
标签:deque 窗口 nums int 最大值 队列 239 滑动

239. 滑动窗口最大值

给你一个整数数组 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

解法:使用单调队列

//利用双端队列手动实现单调队列
/**
 * 用一个单调队列来存储对应的下标,每当窗口滑动的时候,直接取队列的头部指针对应的值放入结果集即可
 * 单调队列类似 (tail -->) 3 --> 2 --> 1 --> 0 (--> head) (右边为头结点,元素存的是下标)
 */
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++) {
            // 根据题意,i为nums下标,是要在[i - k + 1, 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;
    }
}

 

标签:deque,窗口,nums,int,最大值,队列,239,滑动
From: https://www.cnblogs.com/fulaien/p/16897483.html

相关文章

  • 经典dp::三角形求最大值
    洛谷1216思路求和最大,划分没子问题,求的每次子问题最大代码#include<iostream>#include<vector>usingnamespacestd;constintN=1010;intdp[N][N]={0};int......
  • 找数组的最大值并与第一位交换
    #include<stdio.h>intmain(){ //定义 inta[5]={7,8,4,1,5}; int*p; inti; intmax; max=a[0]; intmaxTemp; intmaxX; intmin; min=a[0]; ......
  • 239.滑动窗口最大值
    给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回 滑......
  • 剑指 Offer 59 - I. 滑动窗口的最大值 - 力扣(Leetcode)
    剑指Offer59-I.滑动窗口的最大值-力扣(Leetcode)一.分析方法一:数组长度为1e5,k的大小为1e4,因此直接暴力计算会TLE。我们可以思考一个更复杂的问题:询问任意区间中的......
  • 窗口滑动算法
    窗口滑动算法简介滑动窗口算法思想是非常重要的一种思想,可以用来解决数组,字符串的子元素问题。它可以将嵌套循环的问题,转换为单层循环问题,降低时间复杂度,提高效率。滑动......
  • C++二维数组最大值
    C++二维数组最大值【问题描述】求二维整型数组的"最大点"。二维数组的"最大点"定义为:某个数是所在行的最大值,并且是所在列的最大值。注意:某行或某列上可能有多个"最大点"......
  • 滑动窗口
    滑动窗口采用的是guava中提供的Range数据结构里面存取的是一段时间范围publicstaticRange<Long>buildRange(intminInterval,IntegerwindowRange,IntegerwindowSi......
  • 数组-滑动窗口(直接套模板完事儿)
    前言兄弟们,互联网寒冬期,算法刷着走。上篇文章讲了双指针的左右指针,双指针是数组类算法题中最重要的一个分支之一。这篇文章讲双指针技巧的滑动窗口。遇到双指针的题目,直接......
  • 直播平台开发,按按钮直接滑动到顶部
    直播平台开发,按按钮直接滑动到顶部1.确定图标按钮的位置使用绝对位置使其固定在右下角的位置。 wxml:<icontype="download"size="45"color="#4caf50"bindtap='scr......
  • 工作篇 之 解决谷歌地图与 NestedScrollView 滑动冲突
    LZ-Says:情不知往矣,一往情深。前言话说,前段时间被地图虐个半死,那酸爽程度,简直无与伦比。一会儿,要翻墙;一会儿,网络不稳定,白屏了;一会儿,某些设备不支持GMS服务了。怎一个无......