🌹作者:云小逸
📝个人主页:云小逸的主页
📝Github:云小逸的Github
🤟motto:要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前,其次就是现在!学会自己和解,与过去和解,努力爱自己。==希望春天来之前,我们一起面朝大海,春暖花开!==🤟
👏专栏:C++👏 👏专栏:Java语言👏👏专栏:Linux学习👏
👏专栏:C语言初阶👏👏专栏:数据结构👏👏专栏:备战蓝桥杯👏
文章目录
- 前言
-
- 数组元素的目标和
- 题目:
- 输入格式
- 输出格式
- 数据范围
- 输入样例:
- 输出样例:
- 做题思路:
- 代码:
-
- 最后
-
-
前言
今天我们继续学习双指针问题:【数组元素的目标和】,码字不易,请多多支持!
——————————————————————————————
首先先写上几句话:献给坚持创作的我和点开这篇文章希望进步的你
1. 我们很少信任比我们好的人,宁肯避免与他们来往。相反,我们常对与我们相似、和我们有着共同弱点的人吐露心迹。我们并不希望改掉弱点,只希望受到怜悯与鼓励。
——阿尔贝·加缪《局外人》
2.人的内心,既求生,也求死。我们既追逐光明,也追逐黑暗。我们既渴望爱,有时候却又近乎自毁地浪掷手中的爱。——弗洛伊德
3.我们必须习惯,站在人生的交叉路口,却没有红绿灯的事实。——海明威
数组元素的目标和
题目:
给定两个升序排序的有序数组 A 和 B,以及一个目标值 x。
数组下标从 0 开始。请你求出满足 A[i]+B[j]=x 的数对 (i,j)。
数据保证有唯一解。
输入格式
第一行包含三个整数 n,m,x,分别表示 A 的长度,B 的长度以及目标值 x。
第二行包含 n 个整数,表示数组 A。
第三行包含 m 个整数,表示数组 B。
输出格式
共一行,包含两个整数 i 和 j。
数据范围
数组长度不超过 105。
同一数组内元素各不相同。
1≤数组元素≤109
输入样例:
4 5 6
1 2 4 7
3 4 6 8 9
输出样例:
1 1
做题思路:
双指针问题:
-
它读入三个整数 n,m 和 x,然后读入两个长度分别为 n 和 m 的数组 a 和 b。接下来,代码使用双指针算法在两个数组中寻找两个数,使得它们的和等于 x。如果找到了这样的一对数,程序会输出它们在各自数组中的下标。
-
具体来说,在主函数中,首先使用 scanf() 函数读入输入数据。然后使用一个循环遍历数组 a 中的每一个元素。对于每一个元素 a[i],程序会检查是否存在一个元素 b[j] 使得它们的和等于 x。如果存在这样的一对数,程序会输出它们在各自数组中的下标。
-
这段代码使用了双指针算法来优化搜索过程。具体来说,在遍历数组 a 的同时,程序维护了一个指向数组 b 的指针 j。当遍历到新的元素时,如果当前的两个数之和大于目标值,则将指针向左移动以减小总和;否则检查当前两个数之和是否等于目标值。
代码:
#include <iostream>
using namespace std;
const int N = 1e5 + 10; // 定义常量 N,用于设置数组的最大长度
int n, m, x; // 定义三个整数变量 n,m 和 x
int a[N], b[N]; // 定义两个长度为 N 的整型数组 a 和 b
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 ++ ) // 遍历数组 a 中的每一个元素
{
while (j >= 0 && a[i] + b[j] > x) j -- ; // 如果当前两个数之和大于目标值,则将指针向左移动以减小总和
if (j >= 0 && a[i] + b[j] == x) cout << i << ' ' << j << endl; // 如果找到了一对和等于目标值的数,则输出它们在各自数组中的下标
}
return 0;
}
最后
十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:
1.如果你想要制造羁绊,就得承担流泪的风险。——《小王子》
2.虽然辛苦,我还是会选择那种滚烫的人生。——北野武
3.有些笑容背后是紧咬牙关的灵魂。 ——柴静
最后如果觉得我写的还不错,请不要忘记点赞✌,收藏✌,加关注✌哦(。・ω・。)
愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚菜鸟逐渐成为大佬。加油,为自己点赞!