蓝桥杯-双指针 | 最长连续不重复子序列 | 算法基础

简单说两句

✨ 正在努力的小新~
💖 超级爱分享,分享各种有趣干货!
👩‍💻 提供:模拟面试 | 简历诊断 | 独家简历模板
🌈 感谢关注,关注了你就是我的超级粉丝啦!
🔒 以下内容仅对你可见~

作者:后端小知识CSDN后端领域新星创作者 |阿里云专家博主

CSDN个人主页后端小知识

🔎GZH后端小知识

🎉欢迎关注🔎点赞👍收藏⭐️留言📝

在这里插入图片描述

亲爱的友友们,欢迎观看今天的讲解,今天我们要讲解一个简单的优化算法,这个算法在各大比赛(蓝桥杯,PTA-天梯赛,ICPC-ACM等)中都有涉及,而且这个算法非常简单,想不想知道涅~🤓

image-20240106112119576

好啦,咱也不卖关子了,这个算法就是 - 双指针算法

理论

我们还是来看看理论知识哟

理论

双指针算法是一种在计算机科学中常用的算法策略,它通过使用两个指针来遍历数组或序列,以解决特定的问题。这种算法通常用于解决那些需要在数据结构中找到特定模式或满足特定条件的元素的问题,比如找到两个元素使得它们加起来等于目标值、在有序数组中找到最接近的一对数等。

双指针算法的关键在于理解数据结构的性质(如排序)以及如何通过移动指针来有效地遍历和解决问题。这种算法在面试和算法竞赛中非常常见,因为它简洁且高效。

理论看着是不是有点小枯燥吖,我们来看个例子实践下吧

image.png

例子

下面我们开始实践环节

我们这个题是选自Acwing上面的模板题额~:

🔗我也直接给家人们要来了(贴心吧❤️):最长连续不重复子序列

我们先来看看题目

image.png

这个题目的意思是非常简单的,我们看下这个样例吧😻

连续不重复的子序列是 2 3 5,长度为3,所以输出为3

那么我们怎么去做呢?🙉

思路

【Tips】:注意啦,我们不能采用最直接的双重循环的暴力做法,因为n^2的复杂度会TLE(超时)的

我们采用双指针的做法

  • 我们定义两个指针,分别是 i 和 j (i为右指针,j为左指针)

  • 我们在定义一个用于计数的数组b ,b数组用于统计每个数出现的次数

  • 如果b数组中出现了值大于1的,那么表示出现了重复的,那么我们需要先将b数组中 [ j , i ) 之间的数都计数为0,我们直接减减就可以设为0,重新统计

  • 定义一个ans用于记录, ans = max(ans,i-j+1)

Ok,我们下面来看看AC的代码,可以更好的理解

AC代码清单

#include<bits/stdc++.h>
using namespace std;
int n;
int a[100010];
int b[100010];
int main(){
    //用于输入输出加速,这个可忽略
    ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    int ans=0;
    for(int i=1,j=1;i<=n;i++){
        b[a[i]]++;//计数数组b
        while(b[a[i]]>1){//出现了重复的,将b数组中 [ j , i ) ,之间的数都计数为0
            b[a[j]]--;
            j++;
        }
        ans=max(ans,i-j+1);//更新答案
    }
    cout<<ans;
    return 0;
}

为了方便友友们观看,我也截图贴过来了

在这里插入图片描述

好咯,这次的分享就到这里🌶,我们后续再分享几个双指针算法的题目,友友们可以期待下~

这个代码也是非常简单,大家如果🈶疑问❓的话,可以在评论区留言哟🥂

【都看到这了,点点赞点点关注呗,爱你们】😚😚

抽象工厂  引导关注

💬

✨ 正在努力的小新~
💖 超级爱分享,分享各种有趣干货!
👩‍💻 提供:模拟面试 | 简历诊断 | 独家简历模板
🌈 感谢关注,关注了你就是我的超级粉丝啦!
🔒 以下内容仅对你可见~

作者:后端小知识CSDN后端领域新星创作者 | 阿里云专家博主

CSDN个人主页后端小知识

🔎GZH后端小知识

🎉欢迎关注🔎点赞👍收藏⭐️留言📝

  • 28
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 26
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小叮当撩编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值