算法與數據結構基礎 - 滑動窗口(Sliding Window)

滑動窗口基礎css

滑動窗口經常使用來解決求字符串子串問題,藉助map和計數器,其能在O(n)時間複雜度求子串問題。滑動窗口和雙指針(Two pointers)有些相似,能夠理解爲往同一個方向走的雙指針。經常使用滑動窗口代碼框架以下:git

    //3. Longest Substring Without Repeating Characters
    int lengthOfLongestSubstring(string s) {
        vector<int> v(128,0);  //用於對窗口內的各個字符計數
        int begin=0,end=0,res=0;  //begin,end標識窗口的頭尾
int cnt=0; //窗口計數器 while(end<s.length()){ if(v[s[end++]]++>0) cnt++; //end++右側窗口往右擴展
//檢測到不知足條件時(如這裏出現重複字符),begin++左側窗口往右縮小
while(cnt>0) if(v[s[begin++]]-->1) cnt--; res=max(res,end-begin); } return res; }

以"pwwkew"爲例,以上滑動窗口執行過程圖示以下:github

相關LeetCode題:數據結構

3. Longest Substring Without Repeating Characters  題解框架

159. Longest Substring with At Most Two Distinct Characters  題解spa

992. Subarrays with K Different Integers  題解3d

76. Minimum Window Substring  題解  討論指針

1004. Max Consecutive Ones III  題解 code

763. Partition Labels  題解 blog

 

滑動窗口內的數據還能夠存入更復雜一些的數據結構中,以利用這些數據結構的特性更方便地對數據進行處理,例如如下用到deque/multiset的題目。

相關LeetCode題:

239. Sliding Window Maximum  題解

480. Sliding Window Median  題解

相關文章
相關標籤/搜索