【原创】Sliding Window Maximum 解法分析
这道题是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 解法分析的更多相关文章
- leetcode面试准备:Sliding Window Maximum
leetcode面试准备:Sliding Window Maximum 1 题目 Given an array nums, there is a sliding window of size k wh ...
- 【LeetCode】239. Sliding Window Maximum
Sliding Window Maximum Given an array nums, there is a sliding window of size k which is moving fr ...
- 【刷题-LeetCode】239. Sliding Window Maximum
Sliding Window Maximum Given an array nums, there is a sliding window of size k which is moving from ...
- 【原创】leetCodeOj --- Sliding Window Maximum 解题报告
天,这题我已经没有底气高呼“水”了... 题目的地址: https://leetcode.com/problems/sliding-window-maximum/ 题目内容: Given an arr ...
- LeetCode题解-----Sliding Window Maximum
题目描述: Given an array nums, there is a sliding window of size k which is moving from the very left of ...
- [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 ...
- Sliding Window Maximum 解答
Question Given an array of n integer with duplicate number, and a moving window(size k), move the wi ...
- Sliding Window Maximum
(http://leetcode.com/2011/01/sliding-window-maximum.html) A long array A[] is given to you. There is ...
- [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 ...
随机推荐
- SQL多表连接
在KS系统中分配好权限以后,在用户登录的时候就要通过用户查到角色,通过角色查到界面,界面又属于某个菜单,一共要查4个表.并且不能有重复的记录这个时候就用到了SQL的内连接.SQL的多表连接很方便,以前 ...
- 从零开始学ios开发(十二):Table Views(上)
这次学习的控件非常重要且非常强大,是ios应用中使用率非常高的一个控件,可以说几乎每个app都会使用到它,它就是功能异常强大的Table Views.可以打开你的iphone中的phone.Messa ...
- 微信/QQ机器人的实现
介绍: Mojo-Webqq和Mojo-Weixin是在github上基于webQQ和网页版WeiXin,用Perl语言实现的开源的客户端框架,它通过插件提供基于HTTP协议的api接口供其他语言或系 ...
- c 标签
1 . c:out -- Like <%= ... >, but for expressions. =out.println(String) <c:out value=" ...
- Cocos2D 指定文件夹创建项目
参考http://www.cnblogs.com/skynet/p/3428369.html 通过下面的一些改造,可以让新建的cocos2d-x项目独立于cocos2d-x引擎目录: 1) 将 ...
- duilib中各控件响应的消息类型
消息 说明 Sender click 鼠标点击 CButtonUI dropdown 下拉显示 CComboUI headerclick 点击列标题 CListHeaderItemUI itemact ...
- EXT经验--查询EditorGridPanel的tbar的默认配置对象
前言:EXT的API可谓熟悉EXT的葵花宝典,会看API可谓对于配置EXT,学习EXT最重要的基本功,这点相对于学习轻量级的Easyui来说更加明显. 比如下面的一段代码:注:在Ext.grid.Ed ...
- redis window环境下的安装地址
https://github-cloud.s3.amazonaws.com/releases/3402186/25358446-c083-11e5-89cb-61582694855e.zip?X-Am ...
- mvc 分页js
<script type="text/javascript"> var configA = { options: { m ...
- C# 生成MD5编码方法(不同位数)
/// <summary> /// </summary> /// <param name="strSource"& ...