滑动窗口法
算法介紹
滑動窗口法是在給定特定窗口大小的數組或字符串上執行要求的操作,該算法可以將部分問題中的嵌套循環轉變為單循環,具有較小的時間復雜度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.長度最小的子數組
- 窗口大小固定
LeetCode219.存在重復元素II
- 巧借哈希表記錄
LeetCode187.重復的DNA序列
涼夢空間
歡迎你進入我的個人博客網站參觀交流:https://www.liangmeng.xyz
總結
- 上一篇: simrank算法 java_SimRa
- 下一篇: Web网络攻防文件上传。.