⭐简单说两句⭐
✨ 正在努力的小新~
💖 超级爱分享,分享各种有趣干货!
👩💻 提供:模拟面试 | 简历诊断 | 独家简历模板
🌈 感谢关注,关注了你就是我的超级粉丝啦!
🔒 以下内容仅对你可见~作者:后端小知识,CSDN后端领域新星创作者 |阿里云专家博主
CSDN个人主页:后端小知识
🔎GZH:
后端小知识
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
亲爱的友友们,欢迎观看今天的讲解,今天我们要讲解一个简单的优化算法,这个算法在各大比赛(蓝桥杯,PTA-天梯赛,ICPC-ACM等)中都有涉及,而且这个算法非常简单,想不想知道涅~🤓
好啦,咱也不卖关子了,这个算法就是 - 双指针算法
理论
我们还是来看看理论知识哟
理论
双指针算法是一种在计算机科学中常用的算法策略,它通过使用两个指针来遍历数组或序列,以解决特定的问题。这种算法通常用于解决那些需要在数据结构中找到特定模式或满足特定条件的元素的问题,比如找到两个元素使得它们加起来等于目标值、在有序数组中找到最接近的一对数等。
双指针算法的关键在于理解数据结构的性质(如排序)以及如何通过移动指针来有效地遍历和解决问题。这种算法在面试和算法竞赛中非常常见,因为它简洁且高效。
理论看着是不是有点小枯燥吖,我们来看个例子实践下吧
例子
下面我们开始实践环节
我们这个题是选自Acwing上面的模板题额~:
🔗我也直接给家人们要来了(贴心吧❤️):最长连续不重复子序列
我们先来看看题目
这个题目的意思是非常简单的,我们看下这个样例吧😻
连续不重复的子序列是 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:后端小知识
🎉欢迎关注🔎点赞👍收藏⭐️留言📝