239. Sliding Window Maximum 固定的滑動窗口裏找最大值

Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see thek numbers in the window. Each time the sliding window moves right by one position.

For example,
Given nums = [1,3,-1,-3,5,3,6,7], and k = 3.

Window position                Max
---------------               -----
[1  3  -1] -3  5  3  6  7       3
 1 [3  -1  -3] 5  3  6  7       3
 1  3 [-1  -3  5] 3  6  7       5
 1  3  -1 [-3  5  3] 6  7       5
 1  3  -1  -3 [5  3  6] 7       6
 1  3  -1  -3  5 [3  6  7]      7

Therefore, return the max sliding window as [3,3,5,5,6,7].


解答:

定義一個雙端隊列q,裏面存放窗口中的局部值,位置從大到小;

當輸入一個數據時,從隊尾查看,若該數據小於隊尾值,則加入隊列中;(防止當前面大的值退出後,找不到第二大的值)

若該數據大於隊尾值,則把隊尾值依次pop出來,直到遇到隊尾的值比當前值大或者隊列爲空,再把當前值加入進去;

每次取當前窗口的最大值時,就去q的頭結點就行;

同時,注意這裏是將數據的位置放入q中,目的是爲了記錄,如果窗口移動下一位,最前面的值是q中的最大值時,此時需要將q的頭結點的值退出來,判斷的時候就需要判斷是否q.front() == j - k, 如果滿足,則由於窗口移動,這個最大值已經不在窗口中的,因此需要pop q.front()


代碼如下:


class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        deque<int>dq;
        vector<int>res;
        if(nums.size()  == 0 || k == 0) return res;
        for(int i = 0; i < k; i++){
            if(i == nums.size()) break;
            while(!dq.empty() && nums[dq.back()] < nums[i])
                dq.pop_back();
            dq.push_back(i);
        }
        res.push_back(nums[dq.front()]);
        for(int j = k; j < nums.size(); j++){
            while(!dq.empty() && nums[dq.back()] < nums[j])
                dq.pop_back();
            dq.push_back(j);
            if(dq.front() == j - k)
                dq.pop_front();
            res.push_back(nums[dq.front()]);
        }
        return res;
        
    }
};





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