双指针

1.滑动窗口

1.1流程:

1.左指针右指针初始在同一位置,同方向移动,
2.每次检测左右指针之间的区域
3.不符合/符合要求,右移右指针
4.符合/不符合要求则记录,右移左指针
5.跳出条件:右指针到达末尾
6.在while循环外进行边界处理(重要)

1.2代码模式

61735cde-cde2-4c65-8143-4b5f6a63b03a-2610148.jpg

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.跳出条件:两指针相遇

3.其他

75. 颜色分类

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容