滑動視窗leetcode

2021-09-10 19:08:14 字數 2031 閱讀 4312

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

注意:

你可以假設 k 總是有效的,1 ≤ k ≤ 輸入陣列的大小,且輸入陣列不為空。

高階:

看完題目可知 陣列的長度為n, 視窗的長度為k,則從左到右,一共會有n-k+1次滑動,也就是返回的最大值陣列長度為n-k+1;

第一種想法是 遍歷整個陣列,對於每一次視窗裡的元素再進行一次遍歷取最大值,這樣的時間複雜度為 o(n*k),題目要求盡量複雜度為線性,則考慮用雙端佇列

**如下:

public class maxslidingwindow239 

int n = a.length;

//共有n-k+1次滑動

int res = new int[n-k+1];

//儲存元素下標

dequeq = new arraydeque();

//res陣列的下標指標

int resindex = 0;

for (int i = 0; i < n ; i++)

/*** 如果佇列中最後乙個下標對應的元素= k-1)

}return res;

}public static void main(string args) ;

//視窗大小為3

int k = 3;

int max = maxslidingwindow(a, k);

system.out.println("滑動視窗的最大值:");

arrays.stream(max).foreach(system.out::println);

}

輸出:滑動視窗的最大值:64

599

ps:附上佇列的部分函式說明

/**

* 佇列的方法介紹

* add        增加乙個元索             如果佇列已滿,則丟擲乙個iiiegaislabeepeplian異常

* remove   移除並返回佇列頭部的元素    如果隊列為空,則丟擲乙個nosuchelementexception異常

* element  返回佇列頭部的元素             如果隊列為空,則丟擲乙個nosuchelementexception異常

* offer       新增乙個元素並返回true       如果佇列已滿,則返回false

* poll         移除並返問佇列頭部的元素    如果隊列為空,則返回null

* peek       返回佇列頭部的元素             如果隊列為空,則返回null

* put         新增乙個元素                      如果佇列滿,則阻塞

* take        移除並返回佇列頭部的元素  

*/

leetcode 滑動視窗

面試題57 ii.和為s的連續正數序列 題目 輸入乙個正整數 target 輸出所有和為 target 的連續正整數序列 至少含有兩個數 序列內的數字由小到大排列,不同序列按照首個數字從小到大排列。題解 摘自 什麼是滑動視窗 滑動視窗可以看成陣列中框起來的乙個部分。在一些陣列類題目中,我們可以用滑動...

leetcode 滑動視窗

3.無重複字元的最長子串 給定乙個字串,請你找出其中不含有重複字元的最長子串的長度。示例 1 輸入 abcabcbb 輸出 3解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pww...

leetcode 滑動視窗

滑動視窗可以套用模板 如果不是 left math.max int map.get ch 1,left 而是left int map.get ch 1 當指標到了第二個a時,因為 left map.get a 1,left會後退指向到第乙個a的下乙個下標,即1,所以得到錯誤結果 map只儲存子串中的...