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

相关推荐

头像
10-09 19:35
门头沟学院 Java
洛必不可达:java的竞争激烈程度是其他任何岗位的10到20倍
点赞 评论 收藏
分享
totoroyyw:千年老妖😂
投递华为等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务