滑動視窗最大值

2022-01-10 07:52:58 字數 1508 閱讀 1216

給你乙個整數陣列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

輸入:nums = [1], k = 1

輸出:[1]

輸入:nums = [1,-1], k = 1

輸出:[1,-1]

輸入:nums = [9,11], k = 2

輸出:[11]

/**

* @param nums

* @param k

* @return

*/var maxslidingwindow = function(nums, k) )

return maxgroup;

};// 普通做法超時 需要優化的實現方式

// var maxslidingwindow = function(nums, k)

// return maxgroup;

// };

是猛男就要爆破的方式不管用了,超時警告,那麼只能優化做法,實際上對於兩個相鄰的滑動視窗,它們共用著k-1個元素,而只有1個元素是變化的,我們可以根據這個特點進行優化。我們可以通過維護乙個單調遞減的視窗來實現,當向右移動時左側超出視窗的值彈出,因為需要的是視窗內的最大值,所以只要保證視窗內的值是遞減的即可,即小於新加入的值全部彈出,最左端即為視窗最大值。首先我們定義乙個用來儲存遞減值的下標的視窗,以及儲存最大值的組,之後迴圈給定的陣列,如果當前遍歷的陣列值下標大於視窗大小並且遞減下標視窗的第乙個值是小於當前視窗,即第乙個值在當前需要組合的視窗之外,就將其彈出,之後從後向前遍歷,如果遞減視窗存在值且其中的值小於即將要加入的值就將其彈出,此時將當前遍歷的值的下標加入遞減視窗,最後如果視窗能夠組合成k個就開始取最大值即遞減視窗的第乙個值,將其加入最大值組,迴圈結束後返回即可。

滑動視窗最大值

題目描述 給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為 針對陣列的滑動視窗有以下6個 幾個注意點 利用雙端佇列實現,如果後者比前者大,前者丟擲,後者進,如果比前者小,壓入佇列,判斷隊頭是否過期,這就需...

滑動視窗最大值

給定乙個陣列和滑動視窗的大小,請找出所有滑動視窗裡的最大值。public class 滑動視窗的最大值 if num.length size size 1 用來儲存可能是滑動視窗最大值的數字的下標 linkedlist indexdeque newlinkedlist for int i 0 i s...

滑動視窗最大值

給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 k 個數字。滑動視窗每次只向右移動一位。返回滑動視窗中的最大值。示例 輸入 nums 1,3,1,3,5,3,6,7 和 k 3 輸出 3,3,5,5,6,7 解釋 滑動視窗的位置 最大...