LeetCode(239.滑動視窗的最大值
阿新 • • 發佈:2020-03-18
#### 題目:
給定一個數組nums,有一個大小為k的滑動視窗從陣列的最左側移動到最右側,你只可以看到滑動視窗內的k個數字。滑動視窗每次只向右移動一位。
返回滑動視窗中的最大值。
**示例**:
輸入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
輸出: [3,3,5,5,6,7]
解釋:
滑動視窗的位置 最大值
--------------- -----
[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
**初始思路**:剛開始沒想太多,C++中求陣列的最大值的函式:max_element可以解決此問題。果不其然,AC了而且時間複雜度也很高。顯然不是這個題目的正常解法,一番苦思冥想後還是打開了題解區。臥槽!喲嘚斯內!下面我就能分析下大佬的方法。
**單調佇列解法**:
一個普通佇列輸入什麼數那位置就是什麼數,而單調佇列在輸入一個數時會與前面的比較大小,刪除部分元素來保證佇列的數是**單調遞增或遞減**的。
這樣在這個題目中,每次向右移動都會增刪一個元素,但我們要在**線性時間**找到最大值,我們就可以考慮單調佇列。
單調佇列通常有這幾個函式:
class MonotonicQueue {
// 在隊尾新增元素 n
void push(int n);
// 返回當前佇列中的最大值
int max();
// 隊頭元素如果是 n,刪除它
void pop(int n);
}
然後我們假設已經有了單調佇列這個資料結構來滿足我們的要求,我們可以把此題的解題框架搭出來: