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次,且双指针会出错