- 题目描述
给定两个升序排序的有序数组 A 和 B,以及一个目标值 x。
数组下标从 0 开始。
请你求出满足 A[i]+B[j]=x 的数对 (i,j)。
数据保证有唯一解。
* 输入格式
第一行包含三个整数 n,m,x,分别表示 A 的长度,B 的长度以及目标值 x。
第二行包含 n 个整数,表示数组 A。
第三行包含 m 个整数,表示数组 B。
* 输出格式
共一行,包含两个整数 i 和 j。
* 数据范围
数组长度不超过 10^5。
同一数组内元素各不相同。
1≤数组元素≤10^9
* 输入样例:
4 5 6
1 2 4 7
3 4 6 8 9
* 输出样例:
1 1
- 算法思路
- 仍然先考虑暴力做法,直接枚举数组每一个位置的元素,然后遍历另一个数组的元素,判断是否有等于x的,如果有就输出答案,时间复杂度为O(n*m)
- 观察单调性,对于每一个i而言,i越大对应元素的值也就越大,此时j也就应该从后往前找,也就是i变大j变小,此时时间复杂度为O(n+m)
- 代码实现
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=100010;
int n,m,x;
int a[N],b[N];
int main(){
cin >> n >>m >>x;
for (int i = 0; i < n; i ++ ) cin >>a[i];
for (int i = 0; i < m; i ++ ) cin >>b[i];
for(int i=0;i<n;i++){
int l=0,r=m-1;
while(l<r){
int mid=l+r>>1;
if(b[mid]+a[i]>=x) r=mid;
else l=mid+1;
}
if(a[i]+b[l]==x){
cout << i <<' '<<l<<endl;
break;
}
}
/*for(int i=0,j=m-1;i<n;i++){
while(j && a[i]+b[j]>x) j--;
if(a[i]+b[j]==x){
cout << i <<' '<<j<<endl;
break;
}
}*/
return 0;
}