1. 程式人生 > >LeetCode(239.滑動視窗的最大值

LeetCode(239.滑動視窗的最大值

#### 題目: 給定一個數組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); } 然後我們假設已經有了單調佇列這個資料結構來滿足我們的要求,我們可以把此題的解題框架搭出來: