【简单双指针题-数组求和】

本文介绍了一道关于寻找两个升序数组中元素之和等于特定值的问题,并对比了暴力搜索和双指针算法两种解决方案。暴力搜索的时间复杂度为O(nm),而双指针算法通过巧妙地利用数组的有序特性将时间复杂度降低到O(n+m)。

题目

给定两个升序排列的数组A,B,长度分别为n和m。要求输出两个数列中元素相加的和刚好等于x的两个数组元素的下标值。

题目思路

暴力做法

for(int i = 0;i<n;i++){
	for(int j = 0;j<m;j++){
			if(a[i]+b[j]==x)cout<<i<<' '<<j<<endl;
	}
}

这种做法没什么好说的就是全部遍历一遍。单个单个比较,复杂度爆炸O(nm)。

双指针算法

for(int i = 0,j = m-1;i<n;i++){
       while(j >= 0&&a[i]+b[j]>x)j--;
       if(j>=0;a[i]+b[j]==x)cout<<i<<' '<<j;
       
   }

这个做法核心思路就是在第一层循环时将指向b数组的j指向b的末尾值,也就是b数组中的最大值,当a数组的数加上b数组的数大于目标值,j就指向前一个较小的数。一直到最终找到目标值。这个算法的复杂度是O(n+m);

思路

在这里插入图片描述
上面的代表i初始指向位置,下面代表j指向位置。
因为数组是递增的所以只要a[i]+b[j]<x,说明i以前的所有a[]+b[j]都要小于x,此时i++。
当a[i]+b[j]>x时,说明此时b的值偏大,因为i以后的任意a[]中值都要大于a[i],此时j- -。

为什么j不用再从后面开始往前,会不会有情况a[i]后面的数加b[j]过了的值等于x呢?
答案是不会的,因为j --的条件是a[i]+b[j]>x,可能是a[i]大或者是b[j]大,但是只有可能是b[j]大,因为a[i]往后的数更大,所以答案只能在b[j]前面小的数。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值