双指针算法模板题目

水深无声 2024-03-26 12:38 159阅读 0赞

题目来源:acwing算法基础课

题目链接:
799. 最长连续不重复子序列
题目描述:
在这里插入图片描述

双指针(快慢指针)算法代码:

  1. #include<iostream>
  2. using namespace std;
  3. int a[100010],s[100010];
  4. int main()
  5. {
  6. int n;
  7. cin>>n;
  8. for(int i=0;i<n;++i) cin>>a[i];//输入
  9. int res=0;
  10. for(int i=0,j=0;i<n;i++)
  11. {
  12. s[a[i]]++;//循环遍历,把所有数字都存入到s数组里面
  13. while(j<i && s[a[i]]>1) --s[a[j++]];
  14. //当一个数字出现2次或者2以上 慢指针就要前进 从而 达到重新寻找
  15. //连续不重复子序列的目的。
  16. res=max(res,i-j+1);//不断比较从而迭代
  17. }
  18. cout<<res<<endl;
  19. return 0;
  20. }

题目链接:
800. 数组元素的目标和
题目描述:
在这里插入图片描述

双指针(对撞指针)算法代码:

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int n,m,c;
  6. cin>>n>>m>>c;
  7. int a[100010],b[100010];
  8. for(int i=1;i<=n;++i) cin>>a[i];
  9. for(int j=1;j<=m;++j) cin>>b[j];//输入
  10. for(int i=1,j=m;i<=n;++i)//
  11. {
  12. while(j>=1 && a[i]+b[j]>c) j--;//比较大就j--也就是左移动
  13. if(j>=1&&a[i]+b[j]==c)
  14. {
  15. printf("%d %d\n",i-1,j-1);
  16. }
  17. }
  18. return 0;
  19. }

总结
问题:什么时候用快慢指针,什么时候用对撞指针?

你可以分析整体的单调性,或者模拟实现一下看看哪一个更加的合适。

双指针习题课 | 不听血亏 | 全新的思维方式

发表评论

表情:
评论列表 (有 0 条评论,159人围观)

还没有评论,来说两句吧...

相关阅读

    相关 算法——指针

    一、背景知识 > 双指针(Two Pointers):指的是在遍历元素的过程中,不是使用单个指针进行访问,而是使用两个指针进行访问,从而达到相应的目的。 >

    相关 算法指针题解

    双指针 算法解释:(直接照搬齐姐的了) 双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。也可以延伸到多 个数组的多个指针。 若两个指针指向同一数组

    相关 算法模板-指针

    简介 在很多数组问题中,双指针是一个反复被提及的解法。所谓双指针,指的是在对象遍历的过程中,并非单个指针进行访问,而是使用两个同向(快慢指针)或者反向(对撞指针)来进行扫