AcWing
800. 数组元素的目标和
让i
指向0
,定义j
为a[i] + b[j] > x
的最左边界的前一个位置,起初指向m-1
。当i ++
时,a[i]
增大,由于总和不变,b[j]
必须减小,所以j
只要一直减小,不用回退。
时间复杂度$O(n + m)$.
#include <iostream>
using namespace std;
int n, m, x;
const int N = 100010;
int a[N], b[N];
int p1, p2;
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> m >> x;
for(int i = 0; i <= n - 1; i ++) cin >> a[i];
for(int i = 0; i <= m - 1; i ++) cin >> b[i];
p1 = 0, p2 = m - 1;
while(p1 <= n - 1 && p2 >= 0){
while(a[p1] + b[p2] > x) p2 --;
if(a[p1] + b[p2] == x){
cout << p1 << ' ' << p2;
break;
}
else p1 ++;
}
return 0;
}