这是一个求数组元素目标和的算法题,复杂度要求O(n),我用了双指针来做,下面这个是AC的代码。
#include<bits/stdc++.h>
using namespace std;
const int N = 100003;
int a[N], b[N];
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];
for (int i = 0, j = m-1; i < n; i++) {
while (j >=0 && a[i] + b[j] > x)
j--;
//b从大到小遍历
if (j >= 0 && a[i] + b[j] == x) {
cout << i << " " << j;
return 0;
}
}
下面是我将b从小到大遍历的代码,只是改动了遍历方向,且测试之后发现不会溢出,可以取到尾值,但为什么不AC呢,请大家帮忙答疑。
#include<bits/stdc++.h>
using namespace std;
const int N = 100003;
int a[N], b[N];
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];
//b从小到大遍历
for (int i = 0, j = 0; i < n; i++) {
while (j < m && a[i] + b[j] < x)
j++;
if (j < m && a[i] + b[j] == x) {
cout << i << " " << j;
return 0;
}
j--;
}
}