双指针法典中典 数组元素的目标和

mac2025-10-12  7

数组元素的目标和

给定两个升序排序的有序数组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设在a数组的头部,指针2设在b数组的尾部;然后遍历一遍,知道找出答案;大大降低了复杂度;

代码:

#include<bits/stdc++.h> #define LL long long #define pa pair<int,int> #define lson k<<1 #define rson k<<1|1 //ios::sync_with_stdio(false); using namespace std; const int N=100100; const int M=200100; const LL mod=2e9+7; int a[N],b[N]; int main(){ ios::sync_with_stdio(false); int n,m,x; cin>>n>>m>>x; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=m;i++) cin>>b[i]; int j=m; for(int i=1;i<=n;i++){ while(a[i]+b[j]>x) j--; if(a[i]+b[j]==x){ cout<<i-1<<" "<<j-1<<endl; break; } } return 0; }
最新回复(0)