日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

滑动窗口法

發布時間:2024/3/24 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 滑动窗口法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

算法介紹

滑動窗口法是在給定特定窗口大小的數組或字符串上執行要求的操作,該算法可以將部分問題中的嵌套循環轉變為單循環,具有較小的時間復雜度O(n2)→O(n)。

算法框架

  • 滑動:窗口往某個方向移動的。
  • 窗口:窗口大小可以是固定的,也可以是變化的,可以不斷擴容直到滿足一定的條件,也可以不斷縮小直到找到一個滿足條件的最小窗口。

算法思路

  • 定義左右指針,初始化left = right = 0,把索引閉區間[left, right]稱為一個窗口。
  • 不斷增加right指針擴大窗口[left, right],直到窗口中的部分符合要求(尋找可行解)。
  • 停止增加right指針,然后不斷增加left指針縮小窗口[left, right],直到窗口中的部分不再符合要求,于此同時需要不斷更新結果(優化可行解,尋找最優解)。
  • 重復第2步和第3步,直到right指針到達字符串或者數組的盡頭。

算法模板

# 窗口大小不固定 left, right = 0, 0 res = ??? # 根據實際需要設置 while right < n:window.add(right指針對應的元素)right += 1while window符合要求:檢查是否需要更新reswindow.remove(left指針對應的元素)low += 1return res # 窗口大小固定 right = 0 res = ??? # 根據實際需要設置 while right < n:window.add(right指針對應的元素)right += 1if right >= k: # 窗口達到最大值檢查是否需要更新reswindow.remove(right-k對應的元素)return res # 巧用哈希表記錄 left, right = 0, 0 res = ??? # 根據實際需要設置 hashTable = set()/defaultdict(int) while right < n:更新hashTable # window.add(right對應的元素)檢查是否需要更新reswhile window符合要求:更新hashTable # window.remove(left對應的元素)檢查是否需要更新resright += 1return res

算法應用

  • 窗口大小不固定
    LeetCode209.長度最小的子數組
class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:n = len(nums)res = n+1low, high = 0, 0count = 0while high < n:count += nums[high]while count >= target:res = min(res, high-low+1)count -= nums[low]low += 1high += 1return 0 if res == n+1 else res
  • 窗口大小固定
    LeetCode219.存在重復元素II
class Solution:def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:n = len(nums)sonNums = set()for high in range(n):if high > k:sonNums.remove(nums[high-k-1])if nums[high] in sonNums:return TruesonNums.add(nums[high]) return False
  • 巧借哈希表記錄
    LeetCode187.重復的DNA序列
class Solution:def findRepeatedDnaSequences(self, s: str) -> List[str]:n = len(s)if n <= 10:return []res = []hashTable = defaultdict(int)high = 9while high < n:ason = s[high-9:high+1]hashTable[ason] += 1if hashTable[ason] == 2:res.append(ason)high += 1return res

涼夢空間

歡迎你進入我的個人博客網站參觀交流:https://www.liangmeng.xyz

總結

以上是生活随笔為你收集整理的滑动窗口法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。