所謂滑動視窗,其實就是雙指標有規律的移動,解決要在問題的集合中找到乙個最大/最小區間符合條件的答案。
食用說明:8/13 力扣1004.1.2兩題是對陣列/數字的處理。 思路大概相通,但有乙個重要差異,文中會談到。
3.4.5題需要處理字串。方式和處理數字要複雜一點點,也有很明晰的框架。
第5題和第一題也有異曲同工之處。最後會說明。
8/17結束, 不再更新
}}8/15 力扣209.
}}從上面兩道題來看,整個**的框架沒有什麼大區別, 不同的地方就是在**更新結果 。第一道題問最大長度,在擴充套件的過程中就有可能會獲得答案,不一定需要滿足條件, 於是在擴大視窗中不斷更新答案。
第二道題求長度最小,要求一定會在滿足條件的最小條件下,也就是縮短視窗內更新答案。
8/16.力扣567
和上兩道題處理陣列不同,滑動視窗在處理字串時情況可能要更複雜一些,主要是體現在視窗的擴大和縮小時的具體操作。
思路:
class
solution
while
(match==s1.
length()
)}}return
false;}
}
8/16力扣76.
到目前為止已經刷了3道題,發現滑動視窗框架確實比較明顯,這道題的思路和上題也差不多,變化的就是對結果的處理和一些順序。
class
solution
while
(match==t.
length()
) ch=str[left]
; window[ch]--;
if(map[ch]
>
0&& window[ch]
< map[ch])
left++;}
}return res ;
}}
擴充套件:找到字串中所有字母異位詞 力扣438.
刷到這題,無壓力了,權當熟悉框架來做。
class
solution
while
(match==p.
length()
)}}return ans ;
}}
再來一題別出新裁的:
8/16力扣424.
本題是第一題難一點的版本,難在**?
首先,第一題0和1只有兩種情況,非常好判斷, 而這道題一看,需要面對26種情況,乍一看很複雜,其實經過思考,它面對的也是2種情況。
解題思路:
用乙個freq
代表視窗內出現頻率最大的字母,k次替換肯定是將視窗內其餘字母全部替換成該字母。
class
solution
len=math.
max( len, right-left);}
return len ;
}}
力扣 滑動視窗問題
1.76.最小覆蓋子串,兩個map,滑動視窗,left移動條件是匹配計數 s1的map.size 2.567.字串的排列,看似和上個類似,但是移動條件,很神奇 3.424.替換後的最長重複字元,這個挺難的,將問題轉換為視窗內除了出現次數最多的字元外,其他的字元出現次數不能多於k,這個就是left縮小...
力扣題解 滑動視窗最大值
題目 給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 k 個數字。滑動視窗每次只向右移動一位。返回滑動視窗中的最大值。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 ...
2 3 力扣 滑動視窗中位數
如題 他這是為難我胖虎!中位數是有序序列最中間的那個數。如果序列的長度是偶數,則沒有最中間的數 此時中位數是最中間的兩個數的平均數。例如 給你乙個陣列 nums,有乙個長度為 k 的視窗從最左端滑動到最右端。視窗中有 k 個數,每次視窗向右移動 1 位。你的任務是找出每次視窗移動後得到的新視窗中元素...