题解:AcWing 800 数组元素的目标和
【题目来源】
AcWing:800. 数组元素的目标和 - AcWing题库
【题目描述】
给定两个升序排序的有序数组 \(A\) 和 \(B\),以及一个目标值 \(x\)。
数组下标从 \(0\) 开始。
请你求出满足 \(A[i]+B[j]=x\) 的数对 \((i,j)\)。
数据保证有唯一解。
【输入】
第一行包含三个整数 \(n,m,x\),分别表示 \(A\) 的长度,\(B\) 的长度以及目标值 \(x\)。
第二行包含 \(n\) 个整数,表示数组 \(A\)。
第三行包含 \(m\) 个整数,表示数组 \(B\)。
【输出】
共一行,包含两个整数 \(i\) 和 \(j\)。
【输入样例】
4 5 6
1 2 4 7
3 4 6 8 9
【输出样例】
1 1
【解题思路】

【算法标签】
《AcWing 800 数组元素的目标和》 #双指针#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
const int N = 100010; // 定义数组最大长度
int n, m, x; // n: 数组a的长度, m: 数组b的长度, x: 目标和
int a[N], b[N]; // 两个待处理的数组
int main()
{
// 输入数组a的长度、数组b的长度和目标和x
scanf("%d%d%d", &n, &m, &x);
// 输入数组a的元素
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
// 输入数组b的元素
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++)
{
// 当两数之和大于x时,移动j指针向左寻找更小的数
while (j >= 0 && a[i] + b[j] > x)
{
j--;
}
// 找到满足条件的数对
if (a[i] + b[j] == x)
{
printf("%d %d\n", i, j); // 输出下标
break; // 找到后立即退出
}
}
return 0;
}
【运行结果】
4 5 6
1 2 4 7
3 4 6 8 9
1 1
浙公网安备 33010602011771号