1.滑动窗口
1.1流程:
1.左指针右指针初始在同一位置,同方向移动,
2.每次检测左右指针之间的区域
3.不符合/符合要求,右移右指针
4.符合/不符合要求则记录,右移左指针
5.跳出条件:右指针到达末尾
6.在while循环外进行边界处理(重要)
1.2代码模式
1.3双指针解决的两类问题
最大&条件:
右移r到非法,记录此时长度为[l,r-1];然后右移l到合法
最小&条件:
右移r到合法,右移l到非法,记录此时长度为[l,r]
1.4lr之间的数据如何保存
-set
-map
-map+统计字母出现的数组(***)
边界处理:在while循环之后在计算一次两指针之间的长度
1.5双指针的可行性
以最大满足条件问题3. 无重复字符的最长子串为例
无重复字符的最长子串:给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度
暴力法解决该问题:首先找到所有子串,然后筛选出不含有重复字符的子串,然后从中找到最长的不含有重复字符的子串
我认为,双指针的可行性在于,它考虑了所有合法字串
子串一定有起始元素,我们按照始起始元素来考虑所有出现的子串
arr=[a1,b1,c1,d,b2,c2,a2,f]
在第一阶段,l固定,r右移直至失败,说明[l,r-1]合法,[l,r]不合法
我们记录[l,r-1]的长度,这是以l为起始位置的子串中,最长的合法字串;
右移l,假设移至k,字串[k,r]合法,对在[l,k-1]中的每个字母,以此字母为开始的最长合法字串的长度均小于l,r-1
这一套操做之后,我们相当于考虑了,对在[l,k-1]中的每个字母,以此字母为开始的最长合法字串,新的l为k,进行循环
知道r不可右移,算法结束,假设此时l=l1,此时最长的合法字串是[l1,r],需要在while之后进行边界处理,
综上,我们考虑了以每个元素为起始的合法字串的长度,与蛮力等效,算法可行
1.6比medium难一点
l左移需要特殊处理:424. 替换后的最长重复字符
2.前缀最值
1.辅助数组:lmax,rmax表示从最左(右)到该点的最大数字。
2.左指针=0右指针=n-1,初始在数组两边,反方向移动,
3.处理+移动,根据情况辨别谁先谁后
- 每次比较左右指针的数值大小+然后处理指向数值小的指针,根据其lmax,rmax等计算题设的值,必要时更新最值。
11. 盛最多水的容器 - 每次计算此时的结果,根据结果判断哪个指针移动
18. 四数之和
4.跳出条件:两指针相遇