Leetcode239滑動窗口最大值 對初始數組爲空的處理+deque學習

題目
給定一個數組 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;


    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章