在做這道題時,首先想到的解法是使用隊列來做,維護一個隊列,每次保存滑動窗口大小的長度,并判斷此時隊列中的最大值,但這樣做,在k的值較大時,出現了超時問題,代碼如下:
class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> result;queue<int> que;for(int i = 0; i < nums.size(); i++){que.push(nums[i]);while(que.size() == k){int maxNum = que.front();que.pop();que.push(maxNum);for(int flag = 0; flag < k - 1; flag++){int tmp = que.front();maxNum = max(maxNum, tmp);que.pop();que.push(tmp);}result.push_back(maxNum);que.pop();}}return result;}
};
使用deque雙端隊列來完成這道題,首先遍歷前k個元素,將最大值的下標加入到隊列中,如果新加入的下標對應的值大于隊列前面下標對應的值,將其移除。這樣保持這個隊列維護的下標,對應的值時由大到小單調的。
之后每新插一個元素進來,繼續維護這個單調的隊列,然后判斷隊列最前的下標,是否還在滑動窗口內,如果不在,則移除。代碼如下:
class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> result;deque<int> dq;for(int i = 0; i < k; i++){while(!dq.empty() && nums[i] >= nums[dq.back()]){dq.pop_back();}dq.push_back(i);}result.push_back(nums[dq.front()]);for(int i = k; i < nums.size(); i++){while(!dq.empty() && nums[i] >= nums[dq.back()]){dq.pop_back();}dq.push_back(i);while(dq.front() <= i - k){dq.pop_front();}result.push_back(nums[dq.front()]);}return result;}
};