題目
給定一個數組 nums,有一個大小爲 k 的滑動窗口從數組的最左側移動到數組的最右側。你只可以看到在滑動窗口內的 k 個數字。滑動窗口每次只向右移動一位。 返回滑動窗口中的最大值
解題思路
思考:滑動窗口,需要輸出窗口中的最大值,第一反應大頂堆,每次進來一個新元素,要把之前的元素踢掉一個,需要記錄元素下標。第二種方法,用隊列:向右邊移動的時候,進來一個新的,就把最左邊的去掉(從左邊出去),在框內排序找到最大的。同時發現,如果進來一個大的數,比左邊框裏的一些數大,那麼這些小數永遠都不可能是最大值,那麼把這些小數直接扔掉(從右邊出去)。所以得出結論:用雙端隊列。每進來一個新數,就要存一個最大值到res中。
deque學習
stl:deque常用操作以及特點
代碼
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
deque<int> dq;//隊列中存的是下標
vector<int> res;
//對特殊情況爲空的處理
if(nums.empty()){return res;}
for(int i=0;i<nums.size();i++)
{
//如果隊列的個數等於k了,那麼就彈出頂部
if(!dq.empty()&&dq.front()==i-k){
dq.pop_front();}
//進行比較,如果進來的元素大小比最大的,則把之前比它小的元素都去掉
while(!dq.empty()&&nums[i]>nums[dq.back()]){
dq.pop_back();}
//需要雙端隊列,一個是滑動窗口的自然滑動,從左邊出隊pop_front,一個是右邊的數比左邊的數都大,從右邊出隊,pop_back(),
dq.push_back(i);
//最大值永遠是隊列的front,即滑動窗口的最左邊
if(i-k+1>=0){
res.push_back(nums[dq.front()]);
}
}
return res;
}
};