leetcode演算法 滑動視窗

2021-10-22 07:14:43 字數 1687 閱讀 9376

目的:減少while迴圈的次數

目標題型:陣列定長問題,比如求陣列中k個數為一組最大的和/最小的和

例子:給定乙個陣列,陣列中三個數為一組,求最大和。

常規方法:將指標指向陣列的第一位,求該元素和後兩個元素的和;然後移動指標到第二位,求和;直到陣列的最後三位求和為止。這樣做每次都是三個數相加,會有重複的相加過程,比如第一輪和第二輪求和都要將第二位和第三位數相加。

滑動視窗法:第一輪求前三位數的和,然後第二輪將之前的和減去第一位數,再加上第四位數,以此類推,每輪只需要減去乙個數,再加上乙個數。

思路:判斷陣列是否為空,是則返回0。

定義變數sum記錄陣列元素的和初始化為0,result記錄當前最短長度,初始值為陣列長度+1,因為之後要與滑動視窗的長度比較,取較小的乙個,所以先初始化為乙個不可能取到的數。指標i和j分別指向滑動視窗的第乙個元素和最後乙個元素,初始值均為0。當j小於等於陣列長度-1時,進入迴圈,因為j總是大於等於i,所以i也不會超出陣列的範圍。

進入迴圈後,將sum加上當前j指向的元素,即第乙個元素,判斷其是否大於target,是則表示以當前j為結尾的滑動視窗的和大於target,將result和j-i+1比較,將較小的乙個賦值給result,然後將和減去滑動視窗頭i的值,如果減去之後的和還是大於target,就繼續比較result和j-i+1,將較小的乙個賦值給result,直到減去之後的和小於target,說明當前滑動視窗的和不滿足條件了,需要繼續向後擴充套件,j++。

最後,判斷result是否仍然等於初始值,是則表示沒有滿足條件的子陣列,返回0。

class

solution

j++;}

if(result == nums.length +1)

return0;

return result;

}}

思路:

判斷字串是否為空,是則返回0。

定義變數i和j兩個指標,初始化為0。定義count記錄當前母音的數目,result記錄母音最大數目。

當i小於k,即第乙個視窗的範圍內,進入迴圈,判斷當前字母是否為母音,是則count++。退出迴圈即第乙個滑動視窗統計結束,將count賦值給result。

之後當i《字串長度時,進入第二個迴圈,i指向下乙個要進入滑動視窗的元素,判斷其是否為母音,是則count++;j指向下乙個要出滑動視窗的元素,判斷其是否為母音,是則count–。判斷之後將i和j均進一位,比較result和count大小,較大的賦值給result。

class

solution

i++;}

result = count;

while

(i < s.

length()

)if(s.charat

(i)==

'a'|| s.

charat

(i)==

'e'|| s.

charat

(i)==

'i'|| s.

charat

(i)==

'o'|| s.

charat

(i)==

'u')

i++; j++

; result = result > count ? result : count;

}return result;

}}

滑動視窗leetcode

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

leetcode 滑動視窗

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

leetcode 滑動視窗

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