Sliding Window Maximum
hard 原题链接:https://leetcode.com/problems/sliding-window-maximum/
Sliding window maximum
描述
You are given an array of integers
nums
, there is a sliding window of sizek
which is moving from the very left of the array to the very right. You can only see thek
numbers in the window. Each time the sliding window moves right by one position.Return the max sliding window.
例子
Input: nums = [1,3,-1,-3,5,3,6,7], k = 3
Output: [3,3,5,5,6,7]
Explanation:
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
解法一 Time Limit Exceeded O(kN)
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> maxSW;
for(int i=0; i<nums.size()-k+1; i++){
int maxV=INT_MIN;
for(int j=0; j<k; j++){
maxV=max(maxV, nums[i+j]);
}
maxSW.push_back(maxV);
}
return maxSW;
}
};
解法二 use dequeue O(N)
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector <int> ans;
int n=nums.size();
deque <int> q; //only indexes are stored
for(int i=0;i<n;i++)
{
while(!q.empty() && i-q.front()>=k)
q.pop_front(); //only window size of k is allowed
while(!q.empty() && nums[q.back()]<nums[i])
q.pop_back();
q.push_back(i);
if(i>=k-1)ans.push_back(nums[q.front()]); //our max value in O(1)
}
return ans;
}
};
better one
class Solution {
public:
vector<int> maxSlidingWindow(const vector<int> &A, int B) {
vector<int> ans;
deque<int> dq;
for(int i = 0; i < A.size(); i++){
while(!dq.empty() && dq.back() < A[i]) dq.pop_back();
dq.push_back(A[i]);
if(i >= B - 1){
ans.push_back(dq.front());
if(A[i - B + 1] == dq.front()) dq.pop_front();
}
}
return ans;
}
};
最后更新于
这有帮助吗?