滑动窗口的通用框架
/** * ★☆ 启发: * 分析一道题目或者归类一类题目:不能跳过每道题目中具体的题意条件限制 * 要分析出该题目的特点,★ 就应该好好分析改题目的题意限制里暗藏了什么可能性 */ package 数组; /** * 特点:双指针,然后是同方向的 * @author Huangyujun * * 什么时候使用?(与子数组/字符串 有关的题目) * 滑动窗口:是双指针的题目 找出一个数组中满足一定条件的子数组问题,字符串也可以看成数组。看到子数组问题,就是DP回溯滑动窗口这三种之一 * * * * 滑动窗口的通用框架 1:(例题:209_长度最小的子数组) * (做题特点 一:题目给定了具体的值target,但是是要求 >=target,此条件的可以得到的可能情况比较多 【例如题目 要求某种情况下>= target】,而大于target的可能情况就会比较多了 * ① 先移动右指针确定窗口的大致可能范围(在这大致可能范围里找到最优范围),然后暂时固定住右指针, * ② 在满足条件(满足target下):不断的移动左指针,缩小窗口 * ③ 当不满足target了,又开始移动 右指针,然后。。。。。又确定下来窗口的大致可能范围(在这大致可能范围里找到最优范围),然后暂时固定住右指针, * 特点2,形式上的特点(左右指针移动的方向):是一开始左右指针,同方法移动) * */ //public class 滑动窗口的通用框架 1{ // public String slidingWindow(String s, String t) { // // 起始的时候,都位于 0,同方向移动 // int left = 0; // int right = 0; // int sLen = s.length(); // while (right < sLen) { // char c = s.charAt(right); // right++; // //对状态做修改 // while ( 满足某种条件 ) { // //更新ans可能的地方之一 // char c1 = s.charAt(left); // left++; // //对状态做修改 // } // //更新ans可能的地方之二 // } // return 需要的结果变量; // } //} /** * * 滑动窗口的通用框架 2:(例题:57_和为s的连续正数序列) * 做题特点 一:题目给定了具体的值target,这个target条件的可能弹性空间唯一了 【例如题目 要求某种情况下= target】,而等于target的可能情况在“暂时固定下的范围窗口中情况就是固定下该窗口呀” * ① == target,这种直接通过判断找窗口范围,找到一个固定窗口范围后,移动左边指针(达到整体窗口向前移动)去找下一个固定窗口范围 * 这类题:直接 分:①== target,② < target , ③ > target 来找合适的固定窗口范围 */ //public class 滑动窗口的通用框架 2{ // public String slidingWindow(int target) { // // 起始的时候,同方向移动 // int left = 1; // int right = 2; // while (l < r) { // 更新ans // if( ans == target){ // //需要的结果,得到了一个 // l++; // }else if(ans < target){ //比target小,右指针往前移动,扩大范围 // r++; // }else{ //比target大,左指针往前移动,缩小范围 // l++; // } // // } // return 需要的结果变量; // } //}