acwing800数组元素的目标和,双指针
先暴力:
for i遍历每一个a【】
for遍历每一个b【】
ifa【】+b【】==x break
恰因为是a和b是严格单调的且只有一组解(找到一组就break)
所以可以用双指针
i从a左开始,j从b右开始
如果a+b>x,b就前移,这种方法就可以找出所有在小于等于x周边震荡的a+b组合
#include <bits/stdc++.h>
using namespace std;
const int N=100005;
int n,m,x,a[N],b[N];
int main() {
cin>>n>>m>>x;
for(int i=0;i<n;i++) scanf("%d",&a[i]);
for(int i=0;i<m;i++) scanf("%d",&b[i]);
for(int i=0,j=m-1;i<n;i++){
while(j && a[i]+b[j]>x) j--;
if(b[j]+a[i]==x){
printf("%d %d\n",i,j); break;//16行
}
}
return 0;
} 扩展:
如果严格递增不保证唯一解(本题保证唯一解),该双指针可以找到所有等于a+b的组合
但如果不保证严格递增,那就不能用双指针求:因为假设a是n个1,b是m个2,x=3,显然要n*m次,且双指针会出错
查看7道真题和解析