带你从0->1学习双指针算法

举报
秋名山码民 发表于 2022/03/12 12:33:34 2022/03/12
【摘要】 为啥要用双指针?先试想一下,如果用BF来解题for(i = 0;i < len; i++) for(j = 0;j <= i; j++) if(check(——)) 时间复杂度为O(n^2),没有进行优化,如果数列为单调,(sort后必然单调)可以使用双指针优化,所以核心思想:将BF算法O(n^2)=>双指针O(n)在我理解,只要是这种的优化都可以称之为双指针算法 模板实现for(i...

为啥要用双指针?

先试想一下,如果用BF来解题

for(i = 0;i < len; i++)
	for(j = 0;j <= i; j++)
		if(check(——))
			

时间复杂度为O(n^2),没有进行优化,如果数列为单调,(sort后必然单调)可以使用双指针优化,所以核心思想:
将BF算法O(n^2)=>双指针O(n)
在我理解,只要是这种的优化都可以称之为双指针算法

模板实现

for(i = 0,j = 0;i < n;i++)
{
	while(j < i && check(i,j))
		j++;
	//根据题目来看
}

题目:最长不连续子序列

BF算法:

for(int i = 0;i < n; i++)
	for(int j = 0; j <= i; j++)
		if(check(j,i))
		{
			res = max(res,j - i + 1);//更新最大的,即为最长
		} 

双指针算法:

for(int i=0,j=0;i<n;i++)
{
	while(j<=i&&check(j,i))	j++;
	res=max(res,j-i+1);
}

先写bf算法,然后通过i,j之间的单调关系来优化,从而写出双指针算法

#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);
    }
    cout<<res;
    return 0;
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。