分析:
看似简单的一道小题,用暴力会超时,蕴含了精妙的双指针思想。具体过程如下:
代码(C++)
#include <iostream>
using namespace std;
const int N = 100010;
int a[N], b[N];
int main()
{
int n, m, x;
cin >> n >> m >> x;
for (int i = 0; i < n; i ++) scanf("%d", &a[i]);
for (int i = 0; i < m; i ++) scanf("%d", &b[i]);
// 设置两个指针,使 i 指向 a 左端,j 指向 b 右端
for (int i = 0, j = m - 1; i < n; i ++)
{
while (j >= 0 && a[i] + b[j] > x) j --; // b 不断左移,直至找到第一个a[i] + b[j] 小于等于 x 的 j
if (a[i] + b[j] == x) // 若当前 i,j 元素不符合条件则让 i 继续右移
{
printf("%d %d\n", i, j);
break;
}
}
}