LeetCode239|剑指 Offer 59 - I. 滑动窗口的最大值

简介: 前言看到滑动窗口以及示例,很容易被思维局限了,然后呢就开始打框架,用一个for循环,i-i+3这样的范围一直移动,但是每次都要比较这3个值的大小,如何比较呢?用类似之前T155的栈一样比较吧。但是存在一个问题,有些值就重复2-3次,似乎没有这个必要。

前言

看到滑动窗口以及示例,很容易被思维局限了,然后呢就开始打框架,用一个for循环,i-i+3这样的范围一直移动,但是每次都要比较这3个值的大小,如何比较呢?用类似之前T155的栈一样比较吧。但是存在一个问题,有些值就重复2-3次,似乎没有这个必要。

LeetCode155|剑指 Offer 30. 包含 min 函数的栈

更新时间:2021-07-18 22:31:57

跳转

因此,这里我理解了别人的方法,灭掉了自己危险的想法。

解决方案

不使用一个i了,把它看成一个区间[i,j],也不要k个k个这样块移动着看。每次移动,i+1,j+1。而比较采用类似T155却是双端队列的结构,全部一起来比较,这样每个只会比较1次了。

首先来定i和j的范围,i是开头,j是结尾,我们定每次的j为索引,给队列添加值,因此i就要往前移,去1-k的位置。

左边界范围 i ∈ [1 - k, n - k]右边界范围 j ∈ [0, n - 1]

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        deque<int> d;
        vector<int> maxNums;
        auto n = nums.size();
        for(int i= 1- k,j=0;j<n;i++,j++){
            if (i > 0 && d.front() == nums[i-1]){
                d.pop_front();
            }
            while(!d.empty()&&d.back()<nums[j]){
                d.pop_back();
            }
            d.push_back(nums[j]);
            if(i>=0){
                maxNums.push_back(d.front());
            }
        }
        return maxNums;
    }
};

c++ STL为我们直接提供了双端队列,我们直接引用。

每次去比较队列最后的值是否比要入列的值小,如果是那就删去,保留比它大的。最大的值永远是队首。

当i=0的时候,这个窗口才开始形成了。这时候才可以开始每次移动把队首的值加入数组,组成最大值数组

我们在i+1的时候,可能队首的值在移动中被删除了,(是上一个窗口的)那么队列也要做出改变删除,不然无法开始新窗口的比较。

附录双端队列的一些方法

方法 介绍
pop_front 删除第一个元素
front 获取第一个元素
back 获取最后一个元素
pop_back 删除最后一个元素
push_back 向最后添加元素
目录
相关文章
|
1月前
【LeetCode 26】239.滑动窗口最大值
【LeetCode 26】239.滑动窗口最大值
31 1
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
55 6
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
50 4
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 49. 丑数
解决剑指 Offer 49题"丑数"的Python实现,通过动态规划的方法计算出第n个丑数。
41 2
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 04. 二维数组中的查找
剑指Offer题目 "二维数组中的查找" 的Python解决方案,包括非递归迭代、递归以及使用内置函数的二分查找方法,以判断一个有序的二维数组中是否含有给定整数。
36 1
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 03. 数组中重复的数字
解决剑指Offer题目 "数组中重复的数字" 的Python实现方法,通过使用字典来记录数组中每个数字的出现次数,快速找出重复的数字。
37 1
|
3月前
|
iOS开发 MacOS
【Mac系统】解决Vscode中LeetCode插件不能刷剑指offer题库
文章讨论了解决Mac系统中Vscode里LeetCode插件无法刷剑指Offer题库的问题,并提供了一些相关的使用技巧和资源链接。
228 1
|
1月前
【LeetCode 04】滑动窗口法总结
【LeetCode 04】滑动窗口法总结
17 0
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
27 4
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
52 5