题目描述
- 给定两个升序排序的有序数组
A
和B
,以及一个目标值x
。 - 数组下标从
0
开始。 - 请你求出满足
A[i]+B[j]=x
的数对(i,j)
。 - 数据保证有唯一解。
输入格式
- 第一行包含三个整数
n
,m
,x
分别表示A
的长度,B
的长度以及目标值x
。 - 第二行包含
n
个整数,表示数组A
。 - 第三行包含
m
个整数,表示数组B
。
输出格式
- 共一行,包含两个整数
i
和j
。
数据范围
- 数组长度不超过
10^5
。 - 同一数组内元素各不相同。
1 ≤ 数组元素 ≤ 109
。
解题思路
- 这道题看似会类似于我之前的博文 力扣刷题笔记(1)两数之和,实际上却简单的多。之前的题目需要借助哈希表进行快速查询,但是这一道题由于两个数组都是升序的,因此可以使用更加简单的方法。
- 用一个下标
i
记录第一个数组中的元素位置,初始情况下设置为该数组的首元素;用另一个下标j
记录第二个数组中的元素位置,初始情况下设置为该数字的末元素。此时,将两个元素相加,如果结果小于目标值,说明需要放大这两个数字的和,所以将第一个数组的指针向数组右侧有更大元素的位置移动;反之,如果结果大于目标值,则将第二个数组的指针向数组左侧有更小元素的位置移动。通过循环上述方式,直到找到两数之和刚好为目标值的两个元素下标即可。
实现代码
#include <cstdio>
const int N(1e5 + 10);
int a[N], b[N];
bool a_record[N], b_record[N];
int main(void)
{
int n, m, x;
scanf("%d %d %d", &n, &m, &x);
for(int i(0); i < n; ++i) scanf("%d", &a[i]);
for(int j(0); j < m; ++j) scanf("%d", &b[j]);
for(int ap(0), bp(m - 1);;)
{
if(a[ap] + b[bp] > x) bp--;
else if(a[ap] + b[bp] < x) ap++;
else
{
printf("%d %d", ap, bp);
break;
}
}
return 0;
}