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

这篇具有很好参考价值的文章主要介绍了数组元素的目标和(双指针)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、题目来源

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

二、题目描述

给定两个升序排序的有序数组 \(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 

三、算法思路

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

思路如下:

  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)\)文章来源地址https://www.toymoban.com/news/detail-746849.html

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

四、源代码

#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;
}

到了这里,关于数组元素的目标和(双指针)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言:指向数组的指针和指向数组首元素的指针

    相关阅读 C语言 https://blog.csdn.net/weixin_45791458/category_12423166.html?spm=1001.2014.3001.5482         指向数组的指针和指向数组首元素的指针常常被混淆,或者笼统地被称为数组指针,但它们之间是有差别的,本文就将对此进行讨论。         下面的代码首先创建了一个数组,然后创

    2024年02月02日
    浏览(50)
  • C通过指针访问数组元素

    在C语言中,数组除了通过数组索引访问,也可以通过指针来访问数组中的元素。下面是一个简单的例子: 在这个例子中,我们首先定义了一个包含5个元素的整数数组 array 。然后,我们定义了一个指向 array 的第一个元素的指针 ptr 。在 for 循环中,我们使用 *(ptr + i) 来访问数

    2024年02月05日
    浏览(41)
  • 【剑指offer刷题记录 java版】数组双指针 之 其它题目

    本系列文章记录labuladong的算法小抄中剑指offer题目 题目链接:https://leetcode.cn/problems/XltzEq/ 题目链接:https://leetcode.cn/problems/fan-zhuan-dan-ci-shun-xu-lcof/ 题目链接:https://leetcode.cn/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof/ 题目链接:https://leetcode.cn/problems/he-wei-sde-

    2024年02月11日
    浏览(46)
  • PTA 6-8 用指针操作数组输入输出元素(指针做形参)

    从键盘输入n(n=10),n代表数组元素个数,对数组进行所有元素的输入输出,输入输出功能在fun函数中实现,主函数不要动,要求用指针法操作数组,不要用下标法。 函数接口定义: 裁判测试程序样例 输入格式: 先输入数组的元素个数,然后从键盘输入元素 输出格式: 输出数

    2024年04月10日
    浏览(36)
  • c语言200例 051 使用指针实现逆序存放数组元素

    关键技术: 1.自定义创建了个函数 inverte()用来实现对数组元素的逆序存放 2.自定义函数的形参为个指向数组的指针变量x,初始值指向数组 a 的首元素的地址,x+n是 a[n]元素的地址 3.声明指针变量i、j和 p,i初始值为x,即指向数组首元素地址,j的初始值为 x+n-1,即指向数组最

    2024年02月03日
    浏览(45)
  • 双指针问题——求只包含两个元素的最长连续子序列(子数组)

    你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组  fruits  表示,其中  fruits[i]  是第  i  棵树上的水果  种类  。 你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果: 你只有  两个  篮子,并且每

    2024年02月02日
    浏览(28)
  • 【算法】算法(模拟、指针等)解决字符串类题目(C++)

    字符串题目有很多种,这里筛选几个考察模拟、双指针等的题目,并用相关算法解决。 思路 题意分析 :题目要求找到字符串数组中的最长公共前缀。 解法一 : 两两比较 遍历数组,每次比较后更新最长公共前缀,并循环比较找最长公共前缀 解法二 : 统一比较 遍历第一个

    2024年01月16日
    浏览(45)
  • 算法修炼之路之双指针含多道leetcode 经典题目

    目录 前言  一:普通双指针 1.经典题目一  283移动0问题 分析 代码实现 2.经典题目二 1089复写0  分析 代码实现 二:解决成环类问题-快慢指针  经典例题一 202快乐数 分析  代码实现   三:左右相遇指针 经典例题一 11 盛最多水的容器 分析  代码实现    接下来的日子会顺

    2024年04月13日
    浏览(76)
  • 【算法|数组】双指针

    给你一个按 非递减顺序 排序的整数数组 nums ,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 示例 2: 暴力解法 这个很简单啊,无脑平方后调用个排序就解决了。 不过有个很现实的问题就是说:暴力的东西一般都不太好。 这个击败率是不是有点

    2024年02月13日
    浏览(37)
  • 【算法|数组】快慢指针

    给你一个数组 nums 和一个值 val ,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组 。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 首先有一个点我们

    2024年02月13日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包