LeetCode239 滑動視窗最大值

2021-10-02 04:58:53 字數 1991 閱讀 7884

題目描述:

給定乙個陣列 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.length-k+1,

然後是兩層for迴圈,解決,第一層for迴圈是滑動視窗的大小,第二層for迴圈是在滑動視窗內確定最大值。

時間複雜度:o(mn),空間複雜度o (1)

class

solution

int max =0;

for(

int i =

0; i < length; i++)}

array[i]

= max;

}return array;

}}

第二種方法:

借助雙向佇列的特點,兩端都可以進行進和出。

時間複雜度是o(n),空間複雜度o(n).

思路遍歷陣列,將數存放在雙向佇列中,並用l,r來標記視窗的左邊界和右邊界。佇列中儲存的並不是真的數,而是該數值對應的陣列下標位置,並且陣列中的數要從大到小排序。如果當前遍歷的數比隊尾的值大,則需要彈出隊尾值,直到佇列重新滿足從大到小的要求。剛開始遍歷時,l和r都為0,有乙個形成視窗的過程,此過程沒有最大值,l不動,r向右移。當視窗大小形成時,l和r一起向右移,每次移動時,判斷隊首的值的陣列下標是否在[l,r]中,如果不在則需要彈出隊首的值,當前視窗的最大值即為隊首的數。

示例輸入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3

輸出: [3,3,5,5,6,7]

解釋過程中佇列中都是具體的值,方便理解,具體見**。

初始狀態:l=r=0,佇列:{}

i=0,nums[0]=1。隊列為空,直接加入。佇列:

i=1,nums[1]=3。隊尾值為1,3>1,彈出隊尾值,加入3。佇列:

i=2,nums[2]=-1。隊尾值為3,-1<3,直接加入。佇列:。此時視窗已經形成,l=0,r=2,result=[3]

i=3,nums[3]=-3。隊尾值為-1,-3<-1,直接加入。佇列:。隊首3對應的下標為1,l=1,r=3,有效。result=[3,3]

i=4,nums[4]=5。隊尾值為-3,5>-3,依次彈出後加入。佇列:。此時l=2,r=4,有效。result=[3,3,5]

i=5,nums[5]=3。隊尾值為5,3<5,直接加入。佇列:。此時l=3,r=5,有效。result=[3,3,5,5]

i=6,nums[6]=6。隊尾值為3,6>3,依次彈出後加入。佇列:。此時l=4,r=6,有效。result=[3,3,5,5,6]

i=7,nums[7]=7。隊尾值為6,7>6,彈出隊尾值後加入。佇列:。此時l=5,r=7,有效。result=[3,3,5,5,6,7]

class

solution

// 新增當前值對應的陣列下標

queue.

addlast

(i);

// 判斷當前佇列中隊首的值是否有效

if(queue.

peek()

<= i-k)

// 當視窗長度為k時 儲存當前視窗中最大值

if(i+

1>= k)

}return result;

}}

LeetCode 239 滑動視窗最大值

class solution public int maxslidingwindow int nums,int k int numlen nums.length if nums null numlenmaxheap new priorityqueue a,b nums b nums a for in...

LeetCode 239 滑動視窗最大值

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

leetcode239滑動視窗最大值

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