AcWing 800. 《算法基础课》双指针模板题2--数组元素的目标和
原题链接
简单
作者:
藕丝泥霸
,
2023-12-05 11:28:08
,
所有人可见
,
阅读 61
思路
- 单调性:对于数组a,要在b中找到的数为num=target-a[i]
- 由于a是升序的,num构成的序列是降序,满足单调性,考虑 双指针和二分
- 双指针:O(n+m)
- i指向a数组,从0开始往后走,j指向b数组,从m-1开始往前走
- j走到a[i]+b[j]<=target处停下,此时判断是否等于,若不等,移动i指针
- 单调性+二分:O(n+logm)
- 由于num是降序,b是升序,因此利用num的单调性,同时对b进行二分(也可以利用b的单调性,对num进行二分)
- 本质上是固定i,二分j,每次二分完,j指向left,达到缩小区间的目的
- 双向二分:O(logn+logm)
- 由于num、b都是有序,同时二分
- 缩小i j区间
二分
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1e5+10;
int n,m,x;
int a[N],b[N];
int main(){
scanf("%d%d%d",&n,&m,&x);
for(int i=0;i<n;i++) {
int t;
scanf("%d",&t);
a[i]=x-t;
}
for(int i=0;i<m;i++) scanf("%d",&b[i]);
for(int i=0,j=m-1;i<n;i++){
while(j>=0 && b[j]>a[i]) j--;
if(b[j]==a[i]) {
printf("%d %d",i,j);
break;
}
}
return 0;
}