双指针算法

最长连续不重复子序列

给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。

复制代码
 1 #include<iostream>
 2 using namespace std;
 3 const int N=100010;
 4 int main()
 5 {
 6     int n,a[N],s[N]={0},res=0;
 7     scanf("%d",&n);
 8     for(int i=0,j=0;i<n;++i)
 9     {
10         scanf("%d",&a[i]);
11         ++s[a[i]];
12         while(s[a[i]]>1)  --s[a[j++]];
13         res=max(res,i-j+1);
14     }
15     cout<<res<<endl;
16 }
复制代码

 数组元素的目标和

给定两个升序排序的有序数组 A 和B,以及一个目标值 x。

数组下标从 0 开始。

请你求出满足A[i]+B[j]=x 的数对 (i,j)。

数据保证有唯一解。

    双指针算法:

复制代码
 1 #include<iostream>
 2 using namespace std;
 3 const int N=1e5+10;
 4 int n,m,x,a[N],b[N];
 5 int main()
 6 {
 7     cin>>n>>m>>x;
 8     for(int i=0;i<n;i++)cin>>a[i];
 9     for(int j=0;j<m;j++)cin>>b[j];
10     
11     for(int i=0,j=m-1;i<n;i++)
12     {
13         while(j>=0&&a[i]+b[j]>x)j--;
14         if(j>=0&&a[i]+b[j]==x)
15         {
16             cout<<i<<" "<<j;
17             break;
18         }
19     }
20 }
复制代码

     二分算法:

复制代码
 1 #include<iostream>
 2 using namespace std;
 3 const int N=1e5+10;
 4 int n,m,x,a[N],b[N];
 5 int main()
 6 {
 7     cin>>n>>m>>x;
 8     for(int i=0;i<n;i++)cin>>a[i];
 9     for(int j=0;j<m;j++)cin>>b[j];
10     
11     for(int i=0;i<n;i++)
12     {
13         int l=0,r=m-1;
14         while(l<r)
15         {
16             int mid=(l+r)>>1;
17             if(b[mid]>=x-a[i])r=mid;
18             else l=mid+1;
19         }
20         if(b[l]==x-a[i])
21         {
22             cout<<i<<" "<<l;
23             break;
24         }
25     }
26 }
复制代码

 

posted @   hello_0  阅读(5)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示