当前位置 : 主页 > 编程语言 > c语言 >

数组元素的目标和

来源:互联网 收集:自由互联 发布时间:2023-08-28
题目 给定两个升序排序的有序数组 $A$ 和 $B$,以及一个目标值 $x$。 数组下标从 $0$ 开始。 请你求出满足 $A[i]+B[j]=x$ 的数对 $(i,j)$。 数据保证有唯一解。 输入格式第一行包含三个整数

JWvFczgRNg.jpg

题目

给定两个升序排序的有序数组 $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≤数组元素≤10^9$ 输入样例:

4 5 6
1 2 4 7
3 4 6 8 9

输出样例:

1 1

思路

可以用两个指针 $i,j$ 分别指向两个数组的左右,与暴力做法比,$i,j$ 只会朝一个方向变化 while 循环中判断 $i, j$ 对应位置的元素之和与目标和的大小,以此来 i ++ 或 j --

代码

#include <iostream>

using namespace std;

const int N = 100010;
int n, m, x;
int a[N], b[N];

int main()
{
    scanf("%d%d%d", &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]);
    
    for (int i = 0, j = m - 1; i < n; i ++ )
    {
        while (j >= 0 && a[i] + b[j] > x) j -- ;
        
        
        if (a[i] + b[j] == x) printf("%d %d\n", i, j);
    }
    
    return 0;
}
【感谢: 龙石数据大数据分析平台技术支撑 http://www.longshidata.com/pages/government.html, 】
上一篇:C++设计模式之责任链模式
下一篇:没有了
网友评论