int 最大值 239 滑動視窗最大值

2021-10-11 10:35:31 字數 2539 閱讀 7249

給定乙個陣列 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

最簡單的一種方式就是暴力求解,原理其實很簡單,就是視窗在往右滑動的過程中,每滑動一步就計算視窗內最大的值,就以上面的資料畫個圖來看下

**比較簡單,直接看下

public int maxslidingwindow(int nums, int k) 

res[i] = max;

}return res;

}

我們知道一般的佇列都是先進先出的,但雙端佇列兩端都可以進出,如果對雙端佇列不熟悉的可以看下之前寫的359,資料結構-3,佇列。

使用雙端佇列首先要搞懂乙個問題,就是在雙端佇列中,要始終保證隊頭是佇列中最大的值。那怎麼保證呢,就是在新增乙個值之前,比他小的都要被移除掉,然後再新增這個值。我們舉個例子,比如視窗大小是3,雙端佇列中依次新增3個值[4,2,5],在新增5之前我們要把4和2給移除,讓佇列中只有乙個5,因為視窗是往由滑動的,當新增5的時候,4和2都不可能再成為最大值了,並且4和2要比5還先出佇列,搞懂了上面的過程我們隨便畫個圖看下

搞懂了上面的過程**就很容易寫了,再看**之前先來看一下雙端佇列常用的幾個函式

**如下

public int maxslidingwindow(int nums, int k) 

//在新增乙個值之前,前面比他小的都要被移除掉,並且還要保證視窗

//中佇列頭部元素永遠是佇列中最大的

while (!qeque.isempty() && nums[qeque.peeklast()] < nums[i])

//當前元素的下標加入到佇列的尾部

qeque.addlast(i);

//當視窗的長度大於等於k個的時候才開始計算(注意這裡的i是從0開始的)

if (i >= k - 1)

}return res;

}

這個不太容易想到,就是根據視窗大小把陣列分成n個視窗,每個視窗分別從左往右和從右往左掃瞄,記錄掃瞄的最大值,就像下面這樣

視窗分好之後乙個從前往後掃瞄乙個從後往前掃瞄,記錄每個視窗掃瞄的最大值。我們取視窗內的最大值的時候,如果視窗在原陣列中開始的下標正好是k的倍數,比如下面這樣,他的最大值很容易找

但如果視窗滑動到下面這種情況下

如果要找這個視窗的最大值,我們就要選視窗內從左邊掃瞄最後乙個和從右邊掃瞄最後乙個(視窗內從左邊數第乙個)的最大值,也就是下面這樣

res[j] = math.max(maxright[i], maxleft[i + k - 1]);
為什麼要這樣選,大家可以想一下,因為如果選擇從左邊掃瞄的第乙個值的話,那麼這個值可能不是當前視窗內的值,同理從右邊掃瞄的也一樣。

搞懂了上面的分析過程**就很容易寫了

public int maxslidingwindow(int nums, int k) 

//返回的結果值

239 滑動視窗最大值

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

239 滑動視窗最大值

239.滑動視窗最大值 solution deque solution maxindex 暴力法的時間複雜度為 o n k 弊端為每次掃瞄視窗的最大值,每兩次掃瞄之間都會存在重複的值比較,已經知道了他們的最大值是誰了,所以要減少比較次數 為什麼新增的是索引 將i加到隊尾 deque.addlast ...

239 滑動視窗最大值

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