自己原先的思路就是说两个for循环,一个非常脑瘫的写法,就是说将一个一个去比对,
#include <iostream>
using namespace std;
int a[100010],b[100010];
int main(){
int n,m,x;
cin>>n>>m>>x;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<m;i++){
cin>>b[i];
}
int flag=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(x==a[i]+b[j]){
flag=1;
cout<<i<<" "<<j;
return 0;
}
}
}
return 0;
}
然后果然报错了
于是我去看了一下别人的代码,我才发现woc,这俩个数组是单调的增的,也就是说如果我一个数组的下标是从i=0走的,但是宁一个数组从j=m-1开始走的,所以就是说如果当我的i=0的时候,我的j向前走,当a[i]+b[j]=x,我们就可以直接打出答案,但是如果当j走到a[i]+b[j]<x的时候就没必要继续走了(这也是和(n*n)最大的区别),我们就可以让i继续向后走,然后继续这样的循环,直到找到a[i]+b[j]=x跳出外面的循环.
#include <iostream>
using namespace std;
int a[100010],b[100010];
int main(){
int n,m,x;
cin>>n>>m>>x;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<m;i++){
cin>>b[i];
}
int i=0;
int j=m-1;
for(i=0,j=m-1;i<n;i++){
while(a[i]+b[j] > x && j>=0) j--;
if(a[i]+b[j]==x){
cout<<i<<" "<<j;
break;
}
}
return 0;
}