能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解。
法一:
最直接的方法就是,穷举法,复杂度为O(N^2);
法二:
利用sum减去a[i],再查找sum-a[i],是否在数组里,这时候就变成查找了,可利用二分查找;排序的复杂度为O(nlgn),查找的复杂度为O(lgn),最终的复杂度为O(nlgn);
,也可以利用hash查找,只不过空间复杂度增加O(N);
法三:先排好序,然后,i=0,j=n-1,看arr[i]+arr[j]是否等于sum,等于停止查找,小于sum,i++;大于sum,j--;复杂度为O(N)+O(NlgN);
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 (i,j);