快速找出一个数组中的两个数字,其和等于给定值。

快速找出一个数组中的两个数字,其和等于给定值。

解法1:穷举法,时间复杂度O(N);

解法2:变通思路,对数组中的每个数字arr[i]都判别sum-arr[i]在不在数组中。这样就变通为一个查找算法。将数组排序,需要时间O(N*logN)。对于每个arr[i]用二分法查找sum-arr[i]的时间复杂度都为O(logN),总计N*O(logN)+ O(N*logN)= O(N*logN)

当然也可以用hash的方法简化查找,但是空间效率加大了。

解法3:首先对数组进行排序,时间复杂度为O(N*logN)

然后令i=0j=n-1,看arr[i]+arr[j]是否等于sum,如果是则结束,如果小于sum,则i=i+1;如果大于sum,则j=j-1。这样只需要在排好序的数组上遍历一次,就可以得到最后的结果,该步操作的时间复杂度为O(N)。两步加起来的时间复杂度为O(N*logN)

查找伪码:

for( i=0,j=n-1; i<j; )

if(arr[i] + arr[j] == sum)

return (i , j);

else if( arr[i] + arr[j] < sum)

i++;

else

j--;

return (-1,-1);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值