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达到边界。
/* 滑动窗口算法框架 */void slidingWindow(string s, string t) {unordered_map<char, int> need, window;for (char c : t) need[c]++;int left = 0, right = 0;int valid = 0;while (right < s.size()) {// c 是将移入窗口的字符char c = s[right];// 右移窗口right++;// 进行窗口内数据的一系列更新.../*** debug 输出的位置 ***/printf("window: [%d, %d)\n", left, right);/********************/// 判断左侧窗口是否要收缩while (window needs shrink) {// d 是将移出窗口的字符char d = s[left];// 左移窗口left++;// 进行窗口内数据的一系列更新...}}}
