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