这道题是lintcode上的一道题,当然leetcode上同样有。

本题需要寻找O(N)复杂度的算法。

解体思路比较有特点,所以容易想到参考 最小栈 的解题办法。

但是最小栈用栈维护最小值很直观,这道题是队列,用什么数据结构好呢?也许看完暴力解会有点启发。

但是思路还是一样的,最大的要在最前面(直接获取结果),小的值在后面保留下来(防止之后遍历到的时候丢失数据)。并且某值出窗口的时候需要判断是否要修改排在最前面的值。

一。暴力解

当然直观看,暴力求解是 O(NK)的复杂度,大体的代码如下:(写的有点复杂费劲,主要当时是想通过vector构建头尾可变动的队列,发现STL里其实有就放弃了)

    vector<int> maxSlidingWindow(vector<int> &nums, int k) {
// write your code here
if (nums.empty()) return vector<int>(); vector<int> maxVec;
int maxV = INT_MIN;
vector<int> res;
for (int i = ; i < k && i < nums.size(); i++) {
if (maxV < nums[i])
maxV = nums[i];
maxVec.push_back(nums[i]);
}
res.push_back(maxV);
for (int i = k; i < nums.size(); i++) {
maxVec.push_back(nums[i]);
maxVec.erase(maxVec.begin());
if (nums[i - k] == maxV) {
maxV = INT_MIN;
for (int j = ; j < maxVec.size(); j++)
if (maxV < maxVec[j])
maxV = maxVec[j];
}
if (nums[i] > maxV)
maxV = nums[i];
res.push_back(maxV);
} return res;
}

二。大顶堆

这个其实思路希望通过堆的构造还控制O(1)代价获得最大元素,复杂度O(N * logK)

三。双向队列

终于到它了,其实对自己来说是想提醒自己一下STL里deque的存在。就像priority_queue一样容易被忽略。

思路是维持一个不增序的双向队列,最大值在队首(直接获取结果)。队列大小最多是窗口大小,由值出窗口控制。

最坏case时间复杂度为2N,所以O(N)复杂度。

    vector<int> maxSlidingWindow(vector<int> &nums, int k) {
// write your code here
deque<int> my_deq;
vector<int> res;
for (int i = ; i < nums.size(); i++) {
if (i - k >= ) { // 出队列踢头节点判断
if (!my_deq.empty() && nums[i - k] == my_deq.front())
my_deq.pop_front();
}
       // 入队列踢值判断
while (!my_deq.empty() && nums[i] > my_deq.back()) my_deq.pop_back();
my_deq.push_back(nums[i]);
if (i + - k >= ) // 窗口大小满足判断
res.push_back(my_deq.front());
}
if (k > nums.size())
res.push_back(my_deq.front());
return res;
}

转载请注明出处~   http://www.cnblogs.com/xiaoboCSer/p/4895191.html

【原创】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. 【LeetCode】239. Sliding Window Maximum

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

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

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

  4. 【原创】leetCodeOj --- Sliding Window Maximum 解题报告

    天,这题我已经没有底气高呼“水”了... 题目的地址: https://leetcode.com/problems/sliding-window-maximum/ 题目内容: Given an arr ...

  5. LeetCode题解-----Sliding Window Maximum

    题目描述: Given an array nums, there is a sliding window of size k which is moving from the very left of ...

  6. [LeetCode] Sliding Window Maximum 滑动窗口最大值

    Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...

  7. Sliding Window Maximum 解答

    Question Given an array of n integer with duplicate number, and a moving window(size k), move the wi ...

  8. Sliding Window Maximum

    (http://leetcode.com/2011/01/sliding-window-maximum.html) A long array A[] is given to you. There is ...

  9. [Swift]LeetCode239. 滑动窗口最大值 | Sliding Window Maximum

    Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...

随机推荐

  1. hdu 5738 2016 Multi-University Training Contest 2 Eureka 计数问题(组合数学+STL)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5738 题意:从n(n <= 1000)个点(有重点)中选出m(m > 1)个点(选出的点只 ...

  2. java之redis篇(spring-data-redis整合)

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  3. SQL_SERVER_2008升级SQL_SERVER_2008_R2办法 (一、升级;二、重新xie载安装)

    SQL_SERVER_2008升级SQL_SERVER_2008_R2两种办法   今天将由于需要就将我的SQL 2008升级到SQL 2008 R2. 说到为什么要升级是因为,因附加数据库时发现报错 ...

  4. 【学习总结】iOS 数据保存几种方式总结

    在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好.下面介绍一下数据保存的方式: NSKeyedAr ...

  5. VBS基础篇 - RegExp 对象

    正则表达式(RegExp)对象下面的代码说明了RegExp对象的用法: Function RegExpTest(patrn, strng) Dim regEx, Match, Matches '创建变 ...

  6. C#中Hashtable容器的了解与使用

    初涉Hashtable寄语 由于近段时间培训内容涉及到Hashtable方面的知识,由于培训仅仅起到一个引导的作用,加之以前又接触得少,因此对Hashtable这个东东蛮陌生,呵呵,今晚木有事儿就一起 ...

  7. CentOS 6.4 搭建SVN服务器

    SVN作为新一代代码版本管理工具,有很多优点,管理方便,逻辑明确,安全性高,代码一致性高.SVN数据存储有两种方式,BDB(事务安全表类型)和FSFS(一种不需要数据库的存储系统),为了避免在服务器连 ...

  8. 中小企业 IT 运维福利:快速构建 on-call 机制

    大多 IT 运营支撑同学都有过深夜业务应用突然故障的经历,监控系统准确告警,但是白天筋疲力尽的运维同学在熟睡中,经常会遗漏告警提醒:往往是接到主管电话(用户投诉了)才处理.有什么办法解决该问题呢?大多 ...

  9. Java Socket编程readLine返回null,read返回-1的条件

    客户端正常关闭socket的时候,服务器端的readLine()方法会返回null,或者read()方法会返回-1

  10. flexbox弹性盒子布局

    混合划分 demo1,css: #demo1{ width: 100%; background: #ccc; display: -webkit-flex;/*表示使用弹性布局*/ } #demo1 . ...