Leetcode #239 Sliding Window Maximum
2015-07-31 09:49
246 查看
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 =
Therefore, return the max sliding window as
Note:
You may assume k is always valid, ie: 1 ≤ k ≤ input array's size for non-empty array.
Follow up:
Could you solve it in linear time?
Hint:
How about using a data structure such as deque (double-ended queue)?
The queue size need not be the same as the window’s size.
Remove redundant elements and the queue should store only elements that need to be considered.
比较直接的思路是使用优先队列,代码如下,此处使用multiset可以保证集合中同时存在相同元素。
代码耗时是152ms。
在本题的Discuss中,有人用deque写了如下代码,思路要巧妙很多,耗时100ms。
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 --------------- ----- [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -3 5] 3 6 7 5 1 3 -1 [-3 5 3] 6 7 5 1 3 -1 -3 [5 3 6] 7 6 1 3 -1 -3 5 [3 6 7] 7
Therefore, return the max sliding window as
[3,3,5,5,6,7].
Note:
You may assume k is always valid, ie: 1 ≤ k ≤ input array's size for non-empty array.
Follow up:
Could you solve it in linear time?
Hint:
How about using a data structure such as deque (double-ended queue)?
The queue size need not be the same as the window’s size.
Remove redundant elements and the queue should store only elements that need to be considered.
比较直接的思路是使用优先队列,代码如下,此处使用multiset可以保证集合中同时存在相同元素。
代码耗时是152ms。
class Solution { public: vector<int> maxSlidingWindow(vector<int>& nums, int k) { vector<int> res; multiset<int> heap; for(int i = 0; i < k; i++) { heap.insert(nums[i]); } res.push_back(*heap.rbegin()); for (int i = k; i < nums.size(); i++) { heap.erase(heap.find(nums[i - k])); heap.insert(nums[i]); res.push_back(*heap.rbegin()); } return res; } };
在本题的Discuss中,有人用deque写了如下代码,思路要巧妙很多,耗时100ms。
class Solution { public: vector<int> maxSlidingWindow(vector<int>& nums, int k) { vector<int> res; deque<int> q; for (int i = 0; i < nums.size(); ++i) { if (!q.empty() && q.front() == i - k) q.pop_front(); while (!q.empty() && nums[q.back()] < nums[i]) q.pop_back(); q.push_back(i); if (i >= k - 1) res.push_back(nums[q.front()]); } return res; } };
相关文章推荐
- LINUX内核GPIO接口解析
- 经常吹空调皮肤是不是会变黑
- Android Api Demos登顶之路(十二)Presentation
- 根据两点经纬度计算距离
- struts2自定义结果类型
- [转]apache下htaccess不起作用,linux,windows详解
- 月半小夜曲下的畅想--DOCTYPE模式
- RTSP(Real Time Streaming Protocol)实时流协议
- [枚举] 多校联合第四场 hdu328 problem killer
- 本地文件上传
- 网站压测工具Webbench源码分析
- Spring Note 1
- HDU 3006 The Number of set (状态压缩dp)
- cocos2dx中的retain和release
- 算法题:求解两个链表的交集
- uva10870(矩阵快速幂)
- calabash
- 类和对象的介绍
- Ubuntu下配置samba实现文件夹共享
- GCD使用三 -- 线程间通信