題目鏈接:239. Sliding Window Maximum
題目大意:給定一個無序數組和一個k值,要求找出從前往後所有長度爲k的滑動窗口中的最大值
題目思路:用一個雙端隊列維護一個最大值序列,序列中保存序號,每次遇到新的值,我們可以將這個新值與序列中所有值從小到大進行比較,如果該值大於序列中的值,那麼這之間的舊值就沒有用了,因爲新值更大並且序號更高,那麼後面的最大值一定輪不到這個值,而序號比他小但是值比他大的確有可能,因此不能刪,刪的時候注意滑動窗口的範圍就可以了,也就是第一個值的序號需要控制在當前元素的前k個即可,講的不太清楚,可以看代碼,代碼很清晰
時間複雜度&&空間複雜度:O(n)(每個元素只插入一次,也最多刪除一次)&&O(n)
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> res;
deque<int> deq;
for(int i = 0;i < nums.size();i++){
while(!deq.empty()&&i-k == deq.front()) deq.pop_front();
while(!deq.empty()&&nums[deq.back()] < nums[i]) deq.pop_back();
deq.push_back(i);
if(i >= k-1) res.push_back(nums[deq.front()]);
}
return res;
}
};