首页 > 其他分享 >数组元素的目标和(双指针)

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

时间:2023-11-21 23:13:27浏览次数:37  
标签:int 元素 cin ++ 数组 指针

一、题目来源

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)\)。

  • 如果用暴力解题的话,两层 \(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;
}

标签:int,元素,cin,++,数组,指针
From: https://www.cnblogs.com/grave-master/p/17847660.html

相关文章

  • 二维字符数组特殊提醒
    如果要对二维字符数组一个一个位置赋初值,一定要像下面这么做chars[5][5],s1[5][5];for(inti=0;i<5;i++)for(intj=0;j<4;j++)//一定要注意j最多只能到3,因为最后一个位置要用来放停止符{s[i][j]=j+(int)'0';s[i][4]='\0';//一定要手动给最后一个位置放停止符}for......
  • 最长连续不重复子序列(双指针)
    一、算法描述含义双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。另外还可以根据序列进行区分,例如在快排中,双指针指向的是同一个序列,而归并排序中两个指针指向的是两个......
  • 反转数组
    publicclassFanZhuan{publicstaticvoidmain(String[]args){int[]a={10,20,30,40,50,60};for(inti=0,j=a.length-1;i<j;i++,j--){inttemp=a[j];//建立一个零时变量int=tempa[j]=a[i];......
  • 2维区间树状数组
    voidadd(llx,lly,llz){for(intX=x;X<=n;X+=X&-X)for(intY=y;Y<=m;Y+=Y&-Y){t1[X][Y]+=z;t2[X][Y]+=z*x;t3[X][Y]+=z*y;t4[X][Y]+=z*x......
  • 汇编-PTR指针
            ......
  • LeetCode-Java:88合并两个有序数组
    题目:给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1......
  • 三种办法遍历对象数组,获取数组对象中所有的属性值(key,value);四种方法查找对象数组里面
    一,获取对象数组中某属性的所有值如果是要获取具体第几个属性的值,倒是可以用arr[i].name的方法来实现。若是全部的属性的值,并返回一个新的数组嘞,思路是加循环遍历方法如下。1、from方法vararr=[{id:1,name:"小明"},{id:2......
  • [4] 寻找两个正序数组的中位数
    /***@param{number[]}nums1*@param{number[]}nums2*@return{number}*/varfindMedianSortedArrays=function(nums1,nums2){constnums=nums1.concat(nums2).sort((a,b)=>a-b)constll=nums.lengthif(ll%2===0){return......
  • 在word输入化学元素符号
    1、先输入化学元素,首字母大写,后字母小写,后边是数字。2、用鼠标选定数字后,同时按下“Ctrl 和 =”即可。  例:先输入Al2O3,用鼠标选定数字2后,同时按下“Ctrl 和 =”;再用鼠标选定数字3后,同时按下“Ctrl 和 =”即可。   3、单位符号,如立方米,先输入m3,用鼠......
  • java向 jni传递问文件指针
    1、创建fd,jni接口publicstaticnativeintopenFileFromNative(FileDescriptorfileDescriptor);2、java文件获取文件指针ParcelFileDescriptorpfd==getContentResolver().openFileDescriptor(filePathUri,"rw");FileDescriptorfd=pfd.getFileDescriptor()......