您的位置:首页 > 其它

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 =
[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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: