双指针算法

因为之前的时间不连续,这个双指针算法陆陆续续的学了好几天

做题很吃力,今天一口气全部听完,收获也颇多,不知道做题怎样,下午刷题练练手hhh

以下是我个人心得,大佬看了勿喷(我害怕呜呜呜)

双指针算法我觉得要注重两点,第一点:是否有单调性,ij需要往一个方向移动,如果不同方向这个我没试过hhh

比如这个求元素目标和,如果不是升序,那就复杂得多,ij就不能像升序那样那么丝滑的移动

第二点:看i与j的关系,双指针的本质是双层for循环的嵌套的优化,

我个人觉得有三种:i带动j(最长连续不重复子序列),j带动i(是否为子序列),i与j一起动(目标元素和)

大同小异吧,精髓要知道上面三者我把代码放出来一起比较一下:

//i带动j,最长连续不重复子段
for(int i=0,j=0;i<n;i++)
{
    s[a[i]++];//i一直移动 
    while(j<i&&s[a[i]]>1) j++;//只有当遇见重复元素的时候(只有a[i]能遇见),j向前走
    maxn=.... 
} 
//j带动i,是否是子串
for(int j=0,i=0;j<m;j++)
{
    if(i<n&&a[i]==b[j]) i++;//只有遇见相匹配时i才会移动,遇见下一个匹配(j一直在动) 
}  
//j与i一起动,数组目标和
for(int i=0,j=m-1;i<n;i++)
{
    while(j>=0&&a[i]+b[j]>x) j--;//判断清楚在什么时候指针会移动 *****这个就是在大于x的情况下会动
    if(a[i]+b[j]==x)
    {
        printf;
        break;
    }
} 

看看i与j的关系,并且判断条件,什么条件呢,就是在看什么情况下i或者j会移动(个人觉得这句话很管用啊,取决了循环中你写的什么内容)

总之三点吧:

①确认单调性

②确定ij关系

③确定好什么时候ij会动

最后注意一下书写习惯,养成好习惯,我当然有我自己的一个习惯啦,hhh

加油!

上一篇:多元最短路-Floyd算法


下一篇:通配符匹配