[LeetCode] Sliding Window Maximum

Sliding Window Maximum

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?

单调队列。

 1 class Solution {
 2 public:
 3     vector<int> maxSlidingWindow(vector<int>& nums, int k) {
 4         vector<int> res;
 5         if (k == 0 || nums.size() < k) return res;
 6         deque<int> que;
 7         for (int i = 0; i < k; ++i) {
 8             while (!que.empty() && que.back() < nums[i]) que.pop_back();
 9             que.push_back(nums[i]);
10         }
11         res.push_back(que.front());
12         for (int i = k; i < nums.size(); ++i) {
13             if (que.front() == nums[i - k]) que.pop_front();
14             while (!que.empty() && que.back() < nums[i]) que.pop_back();
15             que.push_back(nums[i]);
16             res.push_back(que.front());
17         }
18         return res;
19     }
20 };

 

posted @ 2015-07-18 18:43  Eason Liu  阅读(303)  评论(0编辑  收藏  举报