数组元素的目标和(双指针)

一、题目来源

AcWing算法基础课-800.数组元素的目标和

二、题目描述

给定两个升序排序的有序数组 AB,以及一个目标值 x

数组下标从 0 开始。

请你求出满足 A[i]+B[j]=x 的数对 (i,j)

数据保证有唯一解。

输入格式

第一行包含三个整数 n,m,x 分别表示 A 的长度,B 的长度以及目标值 x

第二行包含 n 个整数,表示数组 A

第三行包含 m 个整数,表示数组 B

输出格式

共一行,包含两个整数 ij

数据范围

数组长度不超过 105
同一数组内元素各不相同。
1109

输入样例:

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

输出样例:

1 1 

三、算法思路

本题使用双指针来解决问题。

思路如下:

  1. i 指针从 a 数组的左边开始枚举, j 指针从 b 数组的右边开始枚举。

  2. 由于两个数组都是有序的,且答案唯一,所以如果此时 a[i]+b[j]>x的话,则减小 b[j],直到不满足a[i]+b[j]>x

    1)如果当前a[i]+b[j]=x 则直接输出即可。

    2)如果当前a[i]+b[j]<x 则增大 a[i] 即可,并重复2.。

  3. 如此遍历一遍,i 不会往左走, j 不会往右走,两个数组都只会遍历一遍即可找出答案,即时间复杂度为 O(m+n)

  • 如果用暴力解题的话,两层 for 循环,时间复杂度 O(n2)
  • 其次,此题两个数组都是有序的,而且答案唯一,这样才能用双指针来优化。

四、源代码

#include <iostream>

using namespace std;

const int N = 100010;

int n, m, x;
int a[N], b[N];

int main()
{
    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 (a[i] + b[j] > x) -- j;
        if (a[i] + b[j] == x)
        {
            cout << i << ' ' << j << endl;
            break;
        }
    }
    
    return 0;
}
posted @   grave-master  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示