// 单调队列取最值 // 取出队首一个时间在范围内的数 intgetMax(int i, int k){ while(!dq.empty() && dq.front().second <= i - k){ dq.pop_front(); } if(!dq.empty()) return dq.front().first; elsereturn-1; }
vector<int> maxSlidingWindow(vector<int>& nums, int k){ vector<int > ans; for(int i = 0 ; i < k ; i ++){ push(nums[i], i); } ans.push_back(getMax(k-1, k)); for(int i = k ; i < nums.size() ; i ++){ push(nums[i], i); ans.push_back(getMax(i, k)); } return ans; } };
classSolution { public: vector<pair<int,int> > q; int h, t; // 单调队列插入 voidpush(int x, int i){ while(t >= h && q[t].first <= x){ t--; } q[++t] = {x, i}; }
// 单调队列取最值 intgetMax(int i, int k){ while(h <= t && q[h].second <= i-k){ h++; } if(h <= t) return q[h].first; return-1; }
vector<int> maxSlidingWindow(vector<int>& nums, int k){ q.resize(nums.size()); h = 0; t = -1; vector<int > ans; for(int i = 0 ; i < k ; i ++){ push(nums[i], i); } ans.push_back(getMax(k-1, k)); for(int i = k ; i < nums.size() ; i ++){ push(nums[i], i); ans.push_back(getMax(i, k)); } return ans; } };