双指针做法模板题
这道题暴力做法时间复杂度是O(n^2),双指针算法时间复杂度是O(n)
思路:因为数组是升序排列的a数组我们从前往后访问,b数组从后往前访问
i指向a数组从前往后遍历,j指向m数组从后往前遍历
如果a[i]+b[j]>k,我们肯定是不能往后移动i了(那样只会使得他们的和更大)此时我们要向前移动j,反之向前移动i
当a[i]+b[j]==x 时输出
C++ 代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int n,m;
int a[N],b[N];
int x;
int main()
{
cin>>n>>m;
cin>>x;
for(int i=0;i<n;i++)scanf("%d",&a[i]);
for(int i=0;i<m;i++)scanf("%d",&b[i]);
//i指向a数组从前往后遍历,j指向m数组从后往前遍历
for(int i=0,j=m-1;i<n;i++){
while(j>0&&a[i]+b[j]>x)j--;
if(j>=0&&a[i]+b[j]==x){
printf("%d %d\n",i,j);
return 0;
}
}
return 0;
}