首页 > 其他分享 >Acwing 800.数组元素的目标和,双指针初步

Acwing 800.数组元素的目标和,双指针初步

时间:2023-10-18 15:45:00浏览次数:49  
标签:Acwing 元素 满足 数组 800 指针

Acwing 800.数组元素的目标和

给定升序的有序数组A(长度为n),B(长度为m)以及目标值x,求出满足\(A[i] + B[j] = x\)的数对\((i,j)\),题目保证仅有 唯一解

输入样例:

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

输出样例:

1 1

双指针来做
定义指针i,j,其中i指向A,j指向B,且i = 0,指向A的首元素,j = m-1,指向B的末尾元素。

给出以下代码

    for(int i=0,j=m-1;i<n;i++)
    {
        while(A[i]+B[j]>x&&j>=0)j--;
        if(A[i]+B[j]==x)
        {
            cout<<i<<" " <<j;
            break;
        }
    }

我们来分析以下,在仅有唯一解以及递增序列这两个前提下

不妨定义这样一种关系\(j = f(i)\),其意思即为对于每个i,\(f(i)\)为令\(A[i]+B[j] >x\)的最小j,用题目输入举例

1 2 4 7
3 4 6 8 9
下标从1开始

i = 1 , 满足f的 j = 3
i = 2 , 满足f的 j = 2
i = 3, 满足f的 j = 1
i = 4, 满足f的 j = 1

显然,由于递增序列的特性,随着 i 的增加,其满足\(A[i]+B[j] >=x\)的最小 j 是在不断减小或者说单调不减的。

而如此来定义\(i\)以及\(j\),每次得到的\((i,j)\) 都是最有可能的数对取值,而我们所要做的就是遍历这些取值来找到那个唯一的等于解。
实际上我们这里的while退出条件为A[i]+B[j]>x,也就是说以A[i]+B[j]<=x来作为分界。每一次退出循环,得到的数对\((i,j_1)\)即为\(j = f(i)\) 得来的i以及j1 = j-1,这样得到的\((i,j_1)\)即为边界A[i]+B[j]>x的左侧,仅有两种可能,即小于或者等于,枚举出等于的那种情况即可。

感谢acwing文章作者AcWing 800. 双指针算法本质剖析: 从起源, 到优化, 到双指针, 到变形 - AcWing),这篇文章很好的打开了思路,严谨有趣

最后,给自己提个醒,双指针类的题目,要找出其对应的单调性,使得两个指针 i ,j 不回退,一直前进(或者后退),从而优化时间复杂度到O(n)

标签:Acwing,元素,满足,数组,800,指针
From: https://www.cnblogs.com/CrescentWind/p/17772520.html

相关文章

  • 【C语言】数组指针
    【C语言】数组指针顾名思义,数组指针是指向数组的指针。例如,p是一个指向含有3个int元素的一维数组的指针:int(*p)[3];//圆括号的优先级更高,让p先与*结合再与[]结合用法:#include<stdio.h>//voiddisplay1(intp[][3])//等价下行写法voiddisplay......
  • 函数指针变量
    函数指针变量函数指针变量应该是⽤来存放函数地址的,未来通过地址能够调用函数intadd(intx,inty){ returnx+y;}intmain(){ printf("%p\n",&add); printf("%p\n",add); return0;}函数是有地址的,add的地址和&add的地址一致说明函数名就是函数的地址将函数的地址......
  • 题解 AcWing 1272. 与众不同
    题目描述定义完美序列:若一个序列内没有重复的数,称这个数列为完美数列。每次给定一个区间\([l,r]\),求这个区间内最长的完美序列长度。具体思路设\(len_i\)表示从\(i\)出发往右的最长完美序列长度。我们定义一个指针\(st\),表示当前枚举的区间左端点,同时定义多一个指针\(......
  • golang值接收者与指针接收者(一)
    golang方法的接收者有两种:值接收者与指针接收者。平时使用中两种接收者的主要区别就是能不能修改接收者的内部值。先说结论:值接收者方法不能修改结构体内部的值,指针接收者方法可以修改结构体内部的值。做个测试:typeStudentstruct{ ageint}func(sStudent)SetAge(ag......
  • BST-Treap名次树指针实现板子 Ver2.0
    为了更好的阅读体验,请点击这里这里只有板子没有原理QWQ可实现1.插入x数2.删除x数(若有多个相同的数,只删除一个)3.查询x数的排名(排名定义为比当前数小的数的个数+1)4.查询排名为x的数5.求x的前驱(前驱定义为小于x,且最大的数)6.求x的后继(后继定义为大于x,且......
  • Acwing.第125场周赛
    比赛链接数量给定一个正整数n,请你计算[1,n]范围内一共有多少个正整数满足能被2整除,但不能被3整除。输入格式一个正整数n。输出格式一个整数,表示满足条件的整数的数量。数据范围前3个测试点满足1≤n≤100。所有测试点满足1≤n≤10000。思路:一个比较简单的模拟......
  • 解析“字符指针变量,数组指针变量,二维数组”
    1.字符指针变量字符指针变量是存放地址的charch='w'; char*pc=&ch; *pc='w';表达式的两个属性:【值属性】计算后的值是多少【类型属性】类型是什么注:hello是常量字符串,不能被修改,是连续存放的,可用printf("%s\n",p);打印字符串。常量字符串指的是在程序中声明的一个不......
  • C语言 通过union共存体释放常量指针指向的堆空间
    union共存体中所有成员占用相同的内存空间。因为free函数参数是void*,常量指针是constvoid*,所以free函数释放常量指针时会因类型不同而失败。#include<stdio.h>#include<malloc.h>#include<string.h>typedefunion_const_ptr{constvoid*cp;void*vp;}co......
  • Day2 前缀和 差分 双指针
    前缀和LuoguP2004领地选择二维前缀和板题,注意开longlong#include<iostream>#include<cstdio>#include<algorithm>usingnamespacestd;intn,m,c,x,y;longlongans,a[1005][1005],s[1005][1005];intmain(){ scanf("%d%d%d",&n......
  • ORA-28001: the password has expired Smartbi配置数据连接
    smartbiconfig配置数据库连接,报获取数据库连接失败ORA-28001:thepasswordhasexpired密码超时 登录数据库服务器,使用sqlplus/assysdba命令,进入oracle数据库 使用:select*fromdba_profileswhereprofile='DEFAULT'andresource_name='PASSWORD_LIFE_TIME';语......