給定乙個陣列 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.它的功能是儲存滑動視窗可能的最大值,整個視窗按降序進行排列。隊頭的最大值是當前滑動視窗的最大值...