Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves right by one position.

For example,
Given nums = [1,3,-1,-3,5,3,6,7], and k = 3.

Window position                Max
--------------- -----
[ -] -
[ - -]
[- - ]
- [- ]
- - [ ]
- - [ ]

Therefore, return the max sliding window as [3,3,5,5,6,7].

题意:

  给定一个数组序列,以及一个固定大小的窗口K,用k从前到后扫描一次数组,返回窗口每个状态下的最大值。

思路:

  使用双端队列deque当做滑动窗口,保证每个状态下最大值总是在队首。比如[1,3,-1,-3,5,3,6,7],那么deque的状态分别为[1] 、[3] (前2步,填装滑动窗口) ,(从第三步正式开始)[3,-1]、 [3,-1,-3]、[5]、[5,3]、[6]、[7],可以看到每次队列的队首元素都是当前滑动窗口的最大值,具体过程可参考代码,有注释。时间复杂度O(n)。

C++:

class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) { vector<int> ret;
if(nums.size() == )
return ret; //双端队列,存储的是元素的下标,不是元素的值
deque<int> slideWindow;
for(int i = ; i < k; i++)
{
//如果要进队列的数比它前面的数字大,则将它前面的数字从后面删除,直到它前边的数字比它大或者队列为空
while(!slideWindow.empty() && nums[i] >= nums[slideWindow.back()])
{
slideWindow.pop_back();
} //加入新元素到队列
slideWindow.push_back(i);
} for(int i = k; i < nums.size(); i++)
{
//队首元素即为当前窗口最大值
ret.push_back(nums[slideWindow.front()]); //如果要进队列的数比它前面的数字大,则将它前面的数字从后面删除,直到它前边的数字比它大或者队列为空
while(!slideWindow.empty() && nums[i] >= nums[slideWindow.back()])
{
slideWindow.pop_back();
} //如果当前队首的元素已经不在窗口内部,则将其从队列前边删除
if(!slideWindow.empty() && slideWindow.front() <= i - k)
slideWindow.pop_front(); //加入新元素到队列
slideWindow.push_back(i);
} //不要忘了最后一个窗口的结果 - -
ret.push_back(nums[slideWindow.front()]); return ret;
}
};

【LeetCode 239】Sliding Window Maximum的更多相关文章

  1. leetcode面试准备:Sliding Window Maximum

    leetcode面试准备:Sliding Window Maximum 1 题目 Given an array nums, there is a sliding window of size k wh ...

  2. 【POJ 2823】【Luogu P1886】Sliding Window 滑动窗口

    POJ 2823 Luogu P1886 [解题思路] 这是一个单调队列算法的经典题目,几乎学习单调队列的人都接触过这题. 利用单调队列算法求出每一个固定区间内的最(大/小)值. 以下以最大值为例: ...

  3. 【原创】Sliding Window Maximum 解法分析

    这道题是lintcode上的一道题,当然leetcode上同样有. 本题需要寻找O(N)复杂度的算法. 解体思路比较有特点,所以容易想到参考 最小栈 的解题办法. 但是最小栈用栈维护最小值很直观,这道 ...

  4. 【LeetCode OJ】Binary Tree Maximum Path Sum

    Problem Link: http://oj.leetcode.com/problems/binary-tree-maximum-path-sum/ For any path P in a bina ...

  5. 【LeetCode练习题】Minimum Window Substring

    找出包含子串的最小窗口 Given a string S and a string T, find the minimum window in S which will contain all the ...

  6. 【leetcode❤python】 414. Third Maximum Number

    #-*- coding: UTF-8 -*- #l1 = ['1','3','2','3','2','1','1']#l2 = sorted(sorted(set(l1),key=l1.index,r ...

  7. 【POJ 2823】Sliding Window(单调队列/堆)

    BUPT2017 wintertraining(16) #5 D POJ - 2823 题意 给定n,k,求滑窗[i,i+k-1]在(1<=i<=n)的最大值最小值. 题解 单调队列或堆. ...

  8. 【LeetCode】239. Sliding Window Maximum

    Sliding Window Maximum   Given an array nums, there is a sliding window of size k which is moving fr ...

  9. 【刷题-LeetCode】239. Sliding Window Maximum

    Sliding Window Maximum Given an array nums, there is a sliding window of size k which is moving from ...

随机推荐

  1. 如何在Eclipse中添加Tomcat的jar包

    原文:如何在Eclipse中添加Tomcat的jar包 右键项目工程,点击Java Build Path 点击Add Library,选择Server Runtime 选择Tomcat版本 此时就看到 ...

  2. UE中使用正则表达式的一些技巧

    UE中使用正则表达式的一些技巧 2010-12-24 10:33:19 分类: Linux 以下是网上摘录的UE 技巧 1)删除空行: 替换 %[ ^t]++^p 为 空串  2)删除行尾空格: 替换 ...

  3. Case 架构的实际应用-2

    Test Plan in TestLink 1. For new release, we will create 2 test plans for each project 2. 1st test p ...

  4. Failed to load unit 'HGCM' (VERR_INVALID_PARAMETER)

    1 清除状态: clear the state,  显示 边上有个 清楚 按钮,作用相当于重启虚拟机 restart

  5. Java —— 枚举(Enum)的使用

    想用枚举,忘了具体的用法了.网上查了下,发现了个不错的网址.分享一下. http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

  6. Linux 总结1

    ============================= 一般 ========================================= chown -R oracle:oinstall ...

  7. 转载 近期微博吐槽言论存档,涉及“性能优化”、C++陋习等

    http://blog.csdn.net/solstice/article/details/9923615 近期微吐槽博言论存档,涉及“性能优化”.C++陋习等 写C++程序的几个陋习:class 名 ...

  8. Codeforces Round #272 (Div. 2) C. Dreamoon and Sums (数学 思维)

    题目链接 这个题取模的时候挺坑的!!! 题意:div(x , b) / mod(x , b) = k( 1 <= k <= a).求x的和 分析: 我们知道mod(x % b)的取值范围为 ...

  9. 线程中无法实例化spring注入的服务的解决办法

    问题描述 在Java Web应用中采用多线程处理数据,发现Spring注入的服务一直报NullPointerException.使用注解式的声明@Resource和XML配置的bean声明,都报空指针 ...

  10. 在blade中定义一个可以被模版使用的变量

    laravel的blade中的数据一般由控制器传入,但是有没有什么办法临时在blade模版中创建并且被blade所使用吗? 答案是肯定的,不过语法稍微复杂一点 {{-- */$variableAvai ...