双指针算法思想

双指针的朴素做法(暴力枚举) 时间复杂度O(n*n)

for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
		.......

双指针算法则是运用题目内部的具体逻辑将上述算法的复杂度降到O(n),
通用模板如下:

for(int i=0,j=0;i<n;i++)
{
	while(j<i&&check(i,j))  j++;
		......
}

最长不重复连续子序列

朴素做法如下:O(n*n)

for(int i=0;i<n;i++)       //i 为子序列右端点
	for(int j=0;j<=i;j++)
		if(check(j,i))
		{
			res=max(res,i-j+1);
		}

简化后做法:

#include<iostream>

using namespace std;
const int N=100010;
int n;
int a[N],s[N];


int main()
{
    cin >> n;
    for(int i=0;i<n;i++)    cin >> a[i];
    
    int res=0;
    for(int i=0,j=0;i<n;i++)
    {
        s[a[i]]++;
        while(s[a[i]]>1)
        {
            s[a[j]]--;
            j++;
        }
        
        res=max(res,i-j+1);
    }
    printf("%d",res);
    return 0;
}
发布了48 篇原创文章 · 获赞 1 · 访问量 1820

猜你喜欢

转载自blog.csdn.net/zhongxinyun/article/details/104141504