給定乙個陣列 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只儲存子串中的...