思路
因 升序排列
开始于a的最小值 a[0] 和 b的最大值 b[m-1]
题目保证有解,则, a[i++] b[j–] 使得 最终找到解
方法while(j > 0 && a[i] + b[j] > 0) j--;
为什么要j–? 因为 a最小值+ b最大值都>x了,要找=x的只能让b指向较小的一个数字了
如果此时, a[i] + b[j] > x 则, 让a[i]后边的数必然更大, 所以让 j– 看b数组较小的数,
若 a[i] + b[j] <=x 则 a[i++] 让i指针后移,使和越大 找到解
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int n, m, x;
int a[N], b[N];
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
int main()
{
IOS;
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, j = m-1; i<n;i++)
{
while(a[i] + b[j] >x && j >=0) j--; // 大于x 且保证 j>=0
if(j>=0 && a[i]+b[j] == x)
{
cout << i << ' '<< j <<endl;
}
}
return 0;
}