带你从0->1学习双指针算法
【摘要】 为啥要用双指针?先试想一下,如果用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)