[leetcode] 239. Sliding Window Maximum解題レポート

2397 ワード

タイトルリンク:https://leetcode.com/problems/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 the k 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] .
Note:  You may assume k is always valid, ie: 1 ≤ k ≤ input array's size for non-empty array.
Follow up: Could you solve it in linear time?
Hint:
How about using a data structure such as deque (double-ended queue)?
The queue size need not be the same as the window’s size.
Remove redundant elements and the queue should store only elements that need to be considered.
Hide Company Tags
 
Zenefits
Hide Tags
 
Heap
Hide Similar Problems
 
(H) Minimum Window Substring (E) Min Stack (H) Longest Substring with At Most Two Distinct Characters (H) Paint House II
構想:1つの両端キューを利用して、私達はO(1)の時間内にキューの頭とキューの尾の要素を削除することができて、しかもO(1)の時間内にランダムにアクセスすることができて、つまり両端のキューはチェーンテーブルと配列の利点を総合しました.
キューに要素の配列中の位置を格納し、キューの厳密な減少を維持する.すなわち、キューヘッダ要素が最大であり、配列中のキューヘッダ要素の位置までの最大数を表す. 
新しい要素を巡回する場合、キューに現在の要素より小さいものがある場合は、キューを削除して、キューの減少を保証します. 
キュー要素の位置の差がkより大きい場合、キューヘッダ要素を除去する.
コードは次のとおりです.
class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        if(nums.size() ==0 || k == 0) return {};
        vector<int> result;
        deque<int> que;
        for(int i = 0; i< nums.size(); i++)
        {
            while(!que.empty() && nums[i] > nums[que.back()])
                que.pop_back();
            que.push_back(i);
            if(i >= que.front() + k) que.pop_front();
            if(i >= k-1) result.push_back(nums[que.front()]);
        }
        return result;
    }
};
参照:https://leetcode.com/discuss/74409/a-concise-solution-using-deque