这道题是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. 源码编译安装MySQL 5.7.9

    安装CentOS 6.3 配置yum:[root@hank-yoon ~]# cd /etc/yum.repos.d/ [root@hank-yoon yum.repos.d]# mkdir a [r ...

  2. boost-内存管理(scoped_array)

    # include <algorithm> string *p=new string[20];    scoped_array<string>  sp(p);    fill_ ...

  3. [ios]scrollView实现移动与缩放

    实现滑动 1.在viewDidLoad中对scrollview的contentSize属性赋值 告诉他滑动范围. 实现缩放 1.在storyboard的scrollview的attribute标签中设 ...

  4. 爬虫组NABC

    Need(需求): 我们小组的研究课题是编写一个更实用的爬虫软件,编写时会应用到学长的部分代码并在其基础上完善创新. 鉴于学长代码已经实现了基本功能,即从网站上面爬取相关的Word文档等与计算机有关的 ...

  5. Java中List和ArrayList的区别

    List:是一个有序的集合,可以包含重复的元素.提供了按索引访问的方式.它继承 Collection.List有两个重要的实现类:ArrayList 和 LinkedListArrayList:我们可 ...

  6. 《C++Primer》复习——with C++11 [3]

    1.我们的程序经常使用很多IO库,用来输入输出例如:istream(输入流)类型,提供输入操作. ostream(输出流)类型, 提供输出操作. cin, 一个istream对象,从标准输入读取数据. ...

  7. Codeforces Round #360 (Div. 2) E. The Values You Can Make 01背包

    题目链接: 题目 E. The Values You Can Make time limit per test:2 seconds memory limit per test:256 megabyte ...

  8. 【转载】Spring中的applicationContext.xml与SpringMVC的xxx-servlet.xml的区别

    一直搞不明白两者的区别. 如果使用了SpringMVC,事实上,bean的配置完全可以在xxx-servlet.xml中进行配置.为什么需要applicationContext.xml?一定必须? 一 ...

  9. 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?

    // test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  10. C# Socket连接超时设置

    问题描述:         对于C# Socket没有超时设置的选项,默认情况下进行Socket连接,返回连接失败需要20-30s时间,严重影响用户体验 问题解决: Socket服务器端: Socke ...