每日一題 239 滑動視窗最大值

2021-10-21 11:06:00 字數 1335 閱讀 4397

最開始的想法是維護乙個list,每次滑動移除nums[left]加入nums[right],並對list進行重新排序,取出最大的值即可,但是最後超時

學習之後決定使用雙端佇列

總體的基本思想就是維護住乙個依次遞減的雙端佇列

總結為:以下幾點

1.隊首元素是當前的最大元素,如果新元素小於隊尾元素,那麼就直接加入隊尾,如果大於隊尾元素,則隊尾元素出隊

2.判斷當前視窗的第乙個元素是否和隊頭元素相等,如果相等隊頭元素出隊

3.繼續然後按照規則進行入隊,維護單調遞減佇列。

第乙個版本因為時間複雜度太高需要進行重排序,所以不能使用了49 / 60 個通過測試用例

第二個版本是使用雙端佇列linkedlist完美解決

public

int[

]maxslidingwindow

(int

nums,

int k);}

int[

] ans =

newint

[n-k+1]

;for

(int i=

0;i)while

(rightcollections.

sort

(temp)

; ans[left]

=temp.

get(k-1)

;return ans;

}public

int[

]maxslidingwindow2

(int

nums,

int k)

int[

] ans =

newint

[n-k+1]

; temp.

offer

(nums[0]

);for(

int i=

1;i) temp.

offer

(nums[i]);

}while

(rightwhile

(!temp.

isempty()

&& nums[right]

>temp.

getlast()

) temp.

offer

(nums[right]);

right++

; left++;}

ans[left]

=temp.

getfirst()

;return ans;

}

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 解釋 滑動視窗的位置...