Leetcode 滑動視窗型別題總結

2021-10-03 17:26:09 字數 2266 閱讀 2694

目錄

sliding window--分為滑動視窗和固定視窗

滑動視窗

固定視窗

滑動視窗題目一般是在陣列、鍊錶、字串等線性結構上進行操作,比如找最長的子字串、最短的子字串等等

判斷是否需要用滑動視窗法:

物件是陣列、鍊錶、字串等線性結構

題目要求求具有最短、最長、或固定長度的子串行

滑動視窗問題一般具有以下結構:

先移動右視窗邊界,逐步擴大右視窗,直到達到臨界條件,然後迴圈移動左視窗,並更新問題答案,直到又不滿足臨界條件需要移動右視窗邊界為止;如此迴圈

而且一般右視窗通過for迴圈來實現移動,左視窗通過if或者while迴圈來實現

leetcode典型例題:

1.minimum size subarray sum

2. longest substring without repeating characters

3.fruit into baskets

4. get equal substrings within budget

如下例題:

分析:物件是陣列,要求找出最小長度的連續子陣列,而子陣列之和大於給定的數s

我們可以先擴大右邊界,直到陣列和達到臨界條件(即大於等於s),然後移動左邊界,並更新最小長度子陣列

class solution 

}return res == int_max ? 0 : res;}};

比如  "cbraiuabc"

一旦發現a重複,我們需要將左視窗移動到a的下一位i;移動到下一位i之後,字串中再出現b就不再算是視窗內的重複,但是map中卻記錄了第一次出現的b,所以我們要比較出現的重複字元的位置與左視窗的位置大小,如果在左視窗左邊,則不算重複,但是如果在左視窗右邊,則左視窗需要移動至該位置+1處

class solution 

map[s[right]] = right;

}res = max(res,right-left);

return res;}};

5.permutation in string6.grumpy bookstore owner設固定視窗是n,

固定視窗右視窗到終點的位置至少要是n,因為右視窗是左視窗的右邊界

先計算出初始視窗內的目標值,然後開始移動

之後右視窗的滑動通過 +n來完成,其他和滑動視窗類似

分析:因為在s2中找子陣列是否與s1 是全排列關係,所以該子陣列需要和s1的長度一致,然後在s2中滑動,知道該視窗內的字母和s1中的字母及個數完全一致

class solution 

vectorvec1(26,0), vec2(26,0);

for(int i = 0; i < n1; i++)//初始視窗內的字母個數以及s1參考的字母個數

if(vec1 == vec2)

//開始移動固定視窗

for(int i = 0; i < n2-n1; i++)

}return false;}};

class solution 

else}}

res = sat;

for(right = 0; right < n1; right++)

if(grumpy[left] == 1)//原來是1表明多加了,原來是0表明應該加上

else

res = max(res,sat);

}return res;}};

滑動視窗型別題

第一題 滑動視窗的最大值 來自 劍指offer 題目 給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為 針對陣列的滑動視窗有以下6個 第二題 dna序列 來自 牛客網 華為機試 題目 輸入描述 輸入乙個s...

滑動視窗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 的連續正整數序列 至少含有兩個數 序列內的數字由小到大排列,不同序列按照首個數字從小到大排列。題解 摘自 什麼是滑動視窗 滑動視窗可以看成陣列中框起來的乙個部分。在一些陣列類題目中,我們可以用滑動...