双指针思路
每移动一次,可以比较上一次窗口的最大值和被移除的值,如果被移除的值小于最大值,则说明最大值仍在新的区间,但是最后超时了
双指针超时代码
class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> res;if(k == 1){return nums;}int maxNum = nums[0];for(int i = 0; i < k; i++){if(maxNum < nums[i]) maxNum = nums[i];}res.push_back(maxNum);int slow = 1, fast = k;for(fast; fast < nums.size(); fast++, slow++){if(res[slow - 1] > nums[slow - 1]){res.push_back(max(res[slow-1], nums[fast]));}else{int tmp = nums[slow];for(int i = slow; i <= fast; i++){if(nums[i] > tmp) tmp = nums[i];}res.push_back(tmp);}}return res;}
};
不超时思路
单调队列中,维护maxiIndex使得,在maxIndex之前的小于等于的元素没必要维护,只有maxIndex不在窗口时才遍历一次,并且也是将比maxIndex小的删掉,并且每增加一个元素就和maxIndex比较,一旦大于就把前面元素全部排除
class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> res;if(k == 1){return nums;}int maxNum = nums[0], maxIndex = 0;for(int i = 0; i < k; i++){if(maxNum <= nums[i]){maxNum = nums[i];maxIndex = i;}}res.push_back(maxNum);int slow = 1, fast = k;for(fast; fast < nums.size(); fast++, slow++){if(nums[fast] > nums[maxIndex]){maxIndex = fast;}if(maxIndex < slow){int tmp = slow;for(int i = slow; i <= fast; i++){if(nums[i] >= nums[tmp]){tmp = i;}}maxIndex = tmp;}res.push_back(nums[maxIndex]);}return res;}
};