算法1 (数据结构)
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m, x;
cin >> n >> m >> x;
vector<int> a(n), b(m);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < m; i++) {
cin >> b[i];
}
unordered_map<int, int> mp;
for (int i = 0; i < m; i++) {
mp[b[i]] = i;
}
for (int i = 0; i < n; i++) {
if (mp.count(x - a[i])) {
cout << i << " " << mp[x - a[i]] << endl;
}
}
return 0;
}
算法2 (二分)
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m, x;
cin >> n >> m >> x;
vector<int> a(n), b(m);
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 t = x - a[i];
// lower_bound 写法:
int l = lower_bound(b.begin(), b.end(), t) - b.begin();
// 手写二分写法:
// int l = 0, r = m - 1;
// while(l < r) {
// int mid = l + r + 1 >> 1;
// if(b[mid] <= t) {
// l = mid;
// } else {
// r = mid - 1;
// }
// }
if (b[l] == t) {
cout << i << " " << l << endl;
}
}
return 0;
}
算法3 (双指针)
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m, x;
cin >> n >> m >> x;
vector<int> a(n), b(m);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < m; i++) {
cin >> b[i];
}
int i = 0, j = m - 1;
for(int i = 0; i < n; i++) {
while(a[i] + b[j] > x && j > 0) {
j--;
}
if(a[i] + b[j] == x) {
cout << i << " " << j << endl;
} else if(a[i] + b[j] > x) {
break;
}
}
return 0;
}