双指针算法总结

一、双指针大概模板: 

1.真·双指针

int left,right;
for(left=0;left<n;left++){
    while(right<m && check(left,right)) right++;
    
    //下面就是题目的解题逻辑:
    /*
        代码块...
    */
}

2.假·双指针

这种双指针看起来像双指针,但是实际上另外一个指针只是代替本来的指针往后遍历
最后我们真正要处理的指针要跳到代替指针的位置上
for(int i=0;i<n;i++){
    int j=i;
    while(j<n && check(j)) j++;
    i=j-1;
}

 

二、双指针可以维护的结构:

(1)两个数列的区间

(2)一个数列里面的多个区间

三、双指针的条件:

双指针大部分需要枚举其中一个指针,然后让另一个指针跟随着移动

 双指针应该满足单调性的条件,即:在一个指针(我们枚举的那一个)往一侧移动时,另外个指针也只能单向移动

详细步骤:

(1)先确定我们要枚举哪一个指针

(2)判断是否具有单调性

(3)最后证明如果题目存在一种解,是否可以通过我们设计的双指针算法找到这种解

        下面贴几道题目:

        800. 数组元素的目标和        799. 最长连续不重复子序列(好题,值得细看)

        2816. 判断子序列(这道题我写的代码有点冗杂,更好的代码可以看题解区的林小鹿)

        P7756 [COCI2012-2013#3] MALCOLM(哈希思想+双指针)

        102. 最佳牛围栏 - AcWing题库(这个双指针有点意思) 

        AcWing 907. 区间覆盖(特殊的双指针)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值