双指针算法
最长连续不重复子序列
给定一个长度为 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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】