快速找出一个数组中的两个数字,其和等于给定值。
解法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=0,j=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);