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.数组元素的目标和,双指针初步的更多相关文章

  1. AcWing 800. 数组元素的目标和

    网址 https://www.acwing.com/solution/AcWing/content/2064/ 题目描述给定两个升序排序的有序数组A和B,以及一个目标值x,请你求出满足A[i] + B ...

  2. [AcWing 800] 数组元素的目标和

    点击查看代码 #include<iostream> using namespace std; const int N = 1e5 + 10; int a[N], b[N]; int mai ...

  3. 剑指Offer01之二维数组中查找目标数

    剑指Offer之二维数组中查找目标数 题目描述 ​ 在一个二维数组中(每个一维数组的长度相等),每一行都是从左到右递增的顺序排序,每一列都是从上到下递增的顺序排序,输入这样一个二维数组和一个整数,判断 ...

  4. C# 一维数组如何快速实现数组元素的数据类型的转换?

    一.场景假设 假设有一串字符串如下所示,字符串中的数字之间已用英文状态下的逗号隔开.要求用此字符串中的数字快速生成int类型的数组,且尽可能使用最少的代码量. string str = "1 ...

  5. java 在循环中删除数组元素

    在写代码中经常会遇到需要在数组循环中删除数组元素的情况,但删除会导致数组长度变化. package com.fortunedr.thirdReport; import java.util.ArrayL ...

  6. js颠倒数组元素顺序reverse()

    颠倒数组元素顺序reverse() reverse() 方法用于颠倒数组中元素的顺序. 语法: arrayObject.reverse() 注意:该方法会改变原来的数组,而不会创建新的数组. 定义数组 ...

  7. js指定分隔符连接数组元素join()

    指定分隔符连接数组元素join() join()方法用于把数组中的所有元素放入一个字符串.元素是通过指定的分隔符进行分隔的. 语法: arrayObject.join(分隔符) 参数说明: 注意:返回 ...

  8. PAT自测_打印沙漏、素数对猜想、数组元素循环右移、数字加倍重排、机器洗牌

    -自测1. 打印沙漏() 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号 ...

  9. JS数组方法汇总 array数组元素的添加和删除

    js数组元素的添加和删除一直比较迷惑,今天终于找到详细说明的资料了,先给个我测试的代码^-^ var arr = new Array(); arr[0] = "aaa"; arr[ ...

  10. JavaScript 数组 length 属性获取数组长度或设置数组元素的数目

    JavaScript 数组 length 属性 JavaScript 数组 length 属性可返回或设置或组中元素的数目,语法如下: array_object.length 利用 length 属性 ...

随机推荐

  1. vue实现word或pdf文档导出的功能

    https://www.jianshu.com/p/73915ef6ac89 Vue - element-ui 中预览 word .exce.ppt以及pdf文件 https://blog.csdn. ...

  2. 昆虫科学院 AtCoder Race Ranking 2023 Autumn

    概况 为提高选手们的训练 / 比赛热情,我们(昆虫科学院)通过商讨,在 \(2023-5-25\) 仿照 AtCoder Race Ranking (WTF) 机制,设立了"昆虫科学院 At ...

  3. SV OOP-1

    内容 面向对象编程 面向对象的基本概念 对象没有办法直接操作,需要通过handle(指向对象的指针)进行操作 面向对象的基本术语 面向对象的优势 类的定义 实例化对象 new() - 产生具体对象,开 ...

  4. Shell-循环-for-while

  5. 【面试题精讲】你知道MySQL中有哪些隔离级别吗

    有时博客内容会有变动,首发博客是最新的,其他博客地址可能未同步,请认准https://blog.zysicyj.top 首发博客地址 系列文章地址 脏读(Dirty Read)是指一个事务读取到了另一 ...

  6. tikv-ctl的简单学习

    tikv-ctl的简单学习 摘要 最近在学习使用 tidb. 有一个场景,单独使用了tikv作为键值对的数据库. 但是比较不幸.总是出现宕机的情况 因为这个环境是单独使用tikv 二进制进行安装的 没 ...

  7. [转帖]创建lvm

    https://www.jianshu.com/p/bf6b92d73b9b 一.环境介绍 服务器中有sda,sdb,sdc,sdd,sde,sdf六块硬盘,其中sda作为系统盘已经安装了系统,需要将 ...

  8. SQLServer 隔离级别的简单学习

    SQLServer 隔离级别的简单学习 背景 上周北京一个项目出现了卡顿的现象. 周末开发测试加紧制作测试发布了补丁,但是并没有好转. 上周四时跟研发訾总简单沟通过, 怀疑是隔离级别有关系.但是不敢确 ...

  9. [转帖]Redis 最大客户端连接数,你了解吗?

    文章系转载,方便整理和归纳,源文地址:https://cloud.tencent.com/developer/article/1803944 1. 前言 上一篇文章<你的Redis集群撑得住吗? ...

  10. [转帖]TCP之Nagle、Cork、Delay ACK(延迟确认)

    https://www.jianshu.com/p/167ba81206fb 参考资料 TCP协议中的Nagle算法 TCP中的Nagle算法 Linux下TCP延迟确认(Delayed Ack)机制 ...