数组元素的目标和(双指针 or 二分)
时间:2022-07-28
本文章向大家介绍数组元素的目标和(双指针 or 二分),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题意描述
给定两个升序排序的有序数组A和B,以及一个目标值x。数组下标从0开始。 请你求出满足A[i] + B[j] = x的数对(i, j)。 数据保证有唯一解。
输入格式 第一行包含三个整数n,m,x,分别表示A的长度,B的长度以及目标值x。 第二行包含n个整数,表示数组A。 第三行包含m个整数,表示数组B。
输出格式 共一行,包含两个整数 i 和 j。
数据范围 数组长度不超过100000。 同一数组内元素各不相同。 1≤数组元素≤109 输入样例: 4 5 6 1 2 4 7 3 4 6 8 9 输出样例: 1 1
解题思路
1.二分 时间复杂度O(nlogn)
要想判断另一个数组中是否存在与该数相加为x的值,只需要在另一个数组中查找是否存在x-a[i],即可。
AC代码:
#include<iostream>
#include<algorithm>
#define IOS ios::sync_with_stdio(false)
using namespace std;
const int maxn=1e6+10;
int a[maxn],b[maxn],n,m,x;
bool search(int &l,int &r,int x){
while(l<r){
int mid=l+r>>1;
if(b[mid]>=x) r=mid;
else l=mid+1;
}
return b[l]==x;
}
int main()
{
IOS;
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;i<n;i++){
int t=x-a[i];
int l=0,r=m-1;
if(search(l,r,t)) printf("%d %dn",i,l);
}
}
2.双指针 时间复杂度O(n)
由于数组是有序数组,所以对于B数组,我们只用从尾部开始遍历,如果两数之和相加大于x,则让指向另一个数组的指针向前移一位,循环停止,说明a[i]+b[j]<=x,而因为是有序数组,对于对于当前的a[i]来说,以后的都是大于等于a[i]的,所以a[i]后面的数字一定存在a[i]+b[j]=x。
AC代码:
#include<iostream>
#include<algorithm>
#define IOS ios::sync_with_stdio(false)
using namespace std;
const int maxn=1e6+10;
int a[maxn],b[maxn],n,m,x;
int main()
{
IOS;
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(j>=0&&a[i]+b[j]>x) j--;
if(a[i]+b[j]==x) cout<<i<<" "<<j;
}
}
- 接口测试 | 25 requests + pytest测试实例
- 接口测试 | 22 requests基础入门
- 图的存储结构的实现(C/C++实现)
- 树和二叉树的存储结构的实现(C/C++实现)
- Selenium3源码之异常模块篇
- 移位密码原理及算法实现
- 排序算法的实现(C/C++实现)
- [开源] 分享导出博客园文章成本地 Markdown 文件存储的工具
- 单表代替密码原理及算法实现
- 【Android开发学习笔记之一】5大布局方式详解
- Selenium3源码之common下action_chains.py模块分析
- 图的简单应用(C/C++实现)
- 一个很easy的脚本--php获取服务器端的相关信息
- Kubernetes网络解决方案的比较
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android 实现长按弹出PopupMenu 菜单栏
- Android开发获取手机Mac地址适配所有Android版本
- Android AIDL实现与服务相互调用方式
- Android获取超级管理员权限的实现
- Android Studio编写AIDL文件后如何实现自动编译生成
- Android 实现永久性开启adb 的root权限
- 使用Android Studio实现为系统级的app签名
- Android开发实现控件双击事件的监听接口封装类
- Android普通应用升级为系统应用并获取系统权限的操作
- 使用kotlin协程提高app性能(译)
- Android中实现ping功能的多种方法详解
- Android开发获取手机内网IP地址与外网IP地址的详细方法与源码实例
- 在Android源码中编译出指定jar包的操作
- Android Studio 视频播放失败 start called in state1 异常怎么解决
- 解决Android 源码编译错误的问题