前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >带你从0->1学习双指针算法

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

作者头像
秋名山码神
发布2022-12-13 14:31:26
1490
发布2022-12-13 14:31:26
举报
文章被收录于专栏:码神随笔

为啥要用双指针?

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

代码语言:javascript
复制
for(i = 0;i < len; i++)
	for(j = 0;j <= i; j++)
		if(check(——))

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

模板实现

代码语言:javascript
复制
for(i = 0,j = 0;i < n;i++)
{
	while(j < i && check(i,j))
		j++;
	//根据题目来看
}

题目:最长不连续子序列

BF算法:

代码语言:javascript
复制
for(int i = 0;i < n; i++)
	for(int j = 0; j <= i; j++)
		if(check(j,i))
		{
			res = max(res,j - i + 1);//更新最大的,即为最长
		} 

双指针算法:

代码语言:javascript
复制
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之间的单调关系来优化,从而写出双指针算法

代码语言:javascript
复制
#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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为啥要用双指针?
  • 模板实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档