1、滑动窗口算法的目的?

主要解决最小子数组最小子串问题。

2、滑动窗口算法的思想?

通过左、右指针生成一个窗口,并且左右指针不断变化来维护这个窗口,主要找到符合要求的解,并不断优化这个解。
其中滑动窗口的右指针不断扩大窗口的范围,当窗口内的对象符合某个条件时,进行统计或者某种操作【找到可行解】;然后左指针收缩窗口来打破条件,以便让右指针右移继续扩大窗口。【不断优化这个解】

3、滑动窗口算法的具体步骤?

step1:创建一个左、右指针left和right,并且初始值left=right=0,然后将左闭右开区间从[left,right)构建一个窗口window。
step2【寻找可行解】:首先我们不断增加右指针right++,使得左闭右开区间[left,right)构建的window窗口满足要求,至此获得了一个【可行解】,并根据题目要求进行相应的操作
step3【不断优化这个可行解】:然后我们不断增加left++,使得左闭右开区间[left,right)构建的window窗口不满足条件,同时,我们每次更新一个left,都要更新一轮结果
step4:重复step2和step3,直到右指针right达到边界。

  1. /* 滑动窗口算法框架 */
  2. void slidingWindow(string s, string t) {
  3. unordered_map<char, int> need, window;
  4. for (char c : t) need[c]++;
  5. int left = 0, right = 0;
  6. int valid = 0;
  7. while (right < s.size()) {
  8. // c 是将移入窗口的字符
  9. char c = s[right];
  10. // 右移窗口
  11. right++;
  12. // 进行窗口内数据的一系列更新
  13. ...
  14. /*** debug 输出的位置 ***/
  15. printf("window: [%d, %d)\n", left, right);
  16. /********************/
  17. // 判断左侧窗口是否要收缩
  18. while (window needs shrink) {
  19. // d 是将移出窗口的字符
  20. char d = s[left];
  21. // 左移窗口
  22. left++;
  23. // 进行窗口内数据的一系列更新
  24. ...
  25. }
  26. }
  27. }