剑指 Offer 59 - I:滑动窗口的最大值

简介: 剑指 Offer 59 - I:滑动窗口的最大值

题目

题目链接

给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。

示例:

输入: 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

解题

此题和leetcode-239:滑动窗口最大值是一样的。

方法一:单调栈

递减单调栈,队列头部最大,队尾最小

由于头部和尾部都要pop,因此采用双向队列deque

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> res;
        deque<int> deque;
        for(int i=0;i<nums.size();i++){
          //当滑动窗口 经过 队列头部后,需要删掉相应的元素
            if(!deque.empty()&&deque.front()==i-k){
                deque.pop_front();
            }
            //当遇到大的数,就更新单调栈
            while(!deque.empty()&&nums[i]>nums[deque.back()]){
                deque.pop_back();
            }
            deque.push_back(i);
            //加入到结果中
            if(i>=k-1) res.push_back(nums[deque.front()]);
        }
        return res;
    }
};
相关文章
|
1月前
|
存储
剑指 Offer 59 - II:队列的最大值
剑指 Offer 59 - II:队列的最大值
15 0
剑指 Offer 59 - II:队列的最大值
|
1月前
剑指 Offer 40:最小的k个数(快速排序)
剑指 Offer 40:最小的k个数(快速排序)
23 0
|
1月前
剑指 Offer 42:连续子数组的最大和
剑指 Offer 42:连续子数组的最大和
24 0
|
1月前
剑指 Offer 45:把数组排成最小的数
剑指 Offer 45:把数组排成最小的数
19 0
|
1月前
「LeetCode」剑指 Offer 40. 最小的k个数
「LeetCode」剑指 Offer 40. 最小的k个数
35 0
|
6月前
|
C++ 索引
LeetCode239|剑指 Offer 59 - I. 滑动窗口的最大值
前言 看到滑动窗口以及示例,很容易被思维局限了,然后呢就开始打框架,用一个for循环,i-i+3这样的范围一直移动,但是每次都要比较这3个值的大小,如何比较呢?用类似之前T155的栈一样比较吧。但是存在一个问题,有些值就重复2-3次,似乎没有这个必要。
21 0
|
1月前
leetcode 剑指 Offer 40. 最小的k个数
leetcode 剑指 Offer 40. 最小的k个数
23 0
|
算法
leetcode-每日一题剑指 Offer II 041. 滑动窗口的平均值(队列模拟)
题目要求我们计算滑动窗口里所有数的平均值,给定了窗口大小size,我们在窗口里的数字个数不超过窗口大小时,按照个数计算平均值,一旦超过窗口大小,我们则需要移动窗口,计算当前窗口里的平均值
88 0
leetcode-每日一题剑指 Offer II 041. 滑动窗口的平均值(队列模拟)
剑指 Offer 42. 连续子数组的最大和
剑指 Offer 42. 连续子数组的最大和
62 0
剑指 Offer 42. 连续子数组的最大和