劍指Offer 滑動視窗的最大值

2021-10-18 22:48:15 字數 1758 閱讀 4325

給定乙個陣列 nums 和滑動視窗的大小 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

方法一:暴力解法

複雜度分析:

**實現:

class

solution

; vector<

int> res;

int start =

0, end = k -1;

while

(end < nums.

size()

) res.

push_back

(temp)

;++start;

++end;

}return res;}}

;

方法二:使用雙端佇列 deque

動態維護乙個雙端佇列,讓佇列的頭部 front() 始終是當前滑動視窗的最大值的索引。

這樣每次只需要取該索引對應的值,就是當前滑動視窗的最大值了。

注意:雙端佇列中儲存的是元素的索引,而不是元素的值。因為當前滑動視窗已經離開佇列的頭部索引所指向的值時,我們需要彈出當前佇列的頭部索引。而只有讓佇列儲存的是索引才能辦到這一點。

之所以用雙端佇列,是因為容器的頭部和尾部都會彈出元素,所以需要乙個兩端開口的容器。

**實現:

class

solution

; vector<

int> res;

deque<

int> findmax;

for(

int i =

0; i < nums.

size()

;++i)

while

(!findmax.

empty()

&& nums[i]

>= nums[findmax.

back()

])if(

!findmax.

empty()

&& i - findmax.

front()

>= k)

findmax.

push_back

(i);

} res.

push_back

(nums[findmax.

front()

]);// 最後乙個滑動視窗還沒計算就退出了 for 迴圈,需補上。

return res;}}

;

劍指offer 滑動視窗最大值

很多題解都是用雙端佇列,但是既然是區間最值得問題,那麼可以用st表 唯一注意的是引數陣列的大小一定要大於視窗的大小,不然沒意義,即 中的len size的時候退出 果然還是引數的合法性一定要考慮,尤其是提示段錯誤的時候,而自己在本地測試沒問題,一般都是引數合法性的問題!一開始就是漏了這個條件,一直提...

劍指offer 滑動視窗的最大值

題目描述 給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們 的最大值分別為 針對陣列的滑動視窗有以下6個 思路描述 掃瞄給定的陣列,用乙個大小為size的堆維護,將這次的元素加入堆中,找出其中的最大值 然後利用firs...

劍指offer 滑動視窗的最大值

題目 劍指offer 滑動視窗的最大值 暴力列舉視窗。class solution ret.push back max return ret 這個思路也是參考了網上的方法,非常的巧妙。對於,設計乙個que.它的功能是儲存滑動視窗可能的最大值,整個視窗按降序進行排列。隊頭的最大值是當前滑動視窗的最大值...