LeetCode刷题:滑动窗口模板以及典型例题
作者:fuxuemingzhu
鏈接:https://leetcode-cn.com/problems/max-consecutive-ones-iii/solution/fen-xiang-hua-dong-chuang-kou-mo-ban-mia-f76z/
來(lái)源:力扣(LeetCode)
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
LeetCode刷題:滑動(dòng)窗口模板以及典型例題
- 滑動(dòng)窗口模板
- 1004. 最大連續(xù)1的個(gè)數(shù) III
滑動(dòng)窗口模板
《挑戰(zhàn)程序設(shè)計(jì)競(jìng)賽》這本書(shū)把滑動(dòng)窗口形象地叫做【蟲(chóng)取法】。因?yàn)榛瑒?dòng)窗口的兩個(gè)指針移動(dòng)的過(guò)程和蟲(chóng)子爬動(dòng)的過(guò)程非常像:前腳不動(dòng),把后腳移動(dòng)過(guò)來(lái);后腳不動(dòng),把前腳向前移動(dòng)。
def findSubArray(nums):N = len(nums) # 數(shù)組/字符串長(zhǎng)度left, right = 0, 0 # 雙指針,表示當(dāng)前遍歷的區(qū)間[left, right],閉區(qū)間sums = 0 # 用于統(tǒng)計(jì) 子數(shù)組/子區(qū)間 是否有效,根據(jù)題目可能會(huì)改成求和/計(jì)數(shù)res = 0 # 保存最大的滿足題目要求的 子數(shù)組/子串 長(zhǎng)度while right < N: # 當(dāng)右邊的指針沒(méi)有搜索到 數(shù)組/字符串 的結(jié)尾sums += nums[right] # 增加當(dāng)前右邊指針的數(shù)字/字符的求和/計(jì)數(shù)while 區(qū)間[left, right]不符合題意:# 此時(shí)需要一直移動(dòng)左指針,直至找到一個(gè)符合題意的區(qū)間sums -= nums[left] # 移動(dòng)左指針前需要從counter中減少left位置字符的求和/計(jì)數(shù)left += 1 # 真正的移動(dòng)左指針,注意不能跟上面一行代碼寫(xiě)反# 到 while 結(jié)束時(shí),我們找到了一個(gè)符合題意要求的 子數(shù)組/子串res = max(res, right - left + 1) # 需要更新結(jié)果right += 1 # 移動(dòng)右指針,去探索新的區(qū)間return res滑動(dòng)窗口中用到了左右兩個(gè)指針,它們移動(dòng)的思路是:以右指針作為驅(qū)動(dòng),拖著左指針向前走。右指針每次只移動(dòng)一步,而左指針在內(nèi)部while循環(huán)中每次可能移動(dòng)多步。右指針是主動(dòng)前移動(dòng),探索未知的新區(qū)域;左指針是被迫移動(dòng),負(fù)責(zé)尋找滿足題意的區(qū)間。
模板的整體思想是:
1004. 最大連續(xù)1的個(gè)數(shù) III
https://leetcode-cn.com/problems/max-consecutive-ones-iii/
解題思路
重點(diǎn):題意轉(zhuǎn)換。把「最多可以把 K 個(gè) 0 變成 1,求僅包含 1 的最長(zhǎng)子數(shù)組的長(zhǎng)度」轉(zhuǎn)換為 「找出一個(gè)最長(zhǎng)的子數(shù)組,該子數(shù)組內(nèi)最多允許有 K 個(gè) 0 」。
經(jīng)過(guò)上面的題意轉(zhuǎn)換,我們可知本題是求最大連續(xù)子區(qū)間,可以使用滑動(dòng)窗口方法。滑動(dòng)窗口的限制條件是:窗口內(nèi)最多有 K 個(gè) 0。
代碼思路
- 使用left和right兩個(gè)指針,分別指向滑動(dòng)窗口的左右邊界。
- right主動(dòng)右移動(dòng):right指針每次移動(dòng)一步。當(dāng)A[right]為0,說(shuō)明滑動(dòng)窗口內(nèi)增加了一個(gè)0;
- left被動(dòng)右移動(dòng):判斷此時(shí)窗口內(nèi)0的個(gè)數(shù),如果超過(guò)了K,則left指針被迫右移動(dòng),直至窗口內(nèi)的0的個(gè)數(shù)小于等于K為止。
- 滑動(dòng)窗口長(zhǎng)度的最大值即為所求。
總結(jié)
以上是生活随笔為你收集整理的LeetCode刷题:滑动窗口模板以及典型例题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 效率提升3倍的Paper阅读方法
- 下一篇: 汇编语言-[bx]和loop指令和多个段