能否快速找出一个数组中的两个數字让这两个数字之和等于一个给定的值,为了简化起见我们假设这个数组中肯定存在至少一组符合要求的解。
到这里,有的读者可能会更进一步地想先排序再二分查找固然可以将时间从O(N^2)缩短到O(N*log2N),但是还有更快的查找方法:hash表因为给定一个数字,根据hash表映射查找另一个数字是否在数组中只需要O(1)时间。这样的话总体的算法复杂度可以降低到O(N),但这种方法需要额外增加O(N)的hash表存储空间某些情况下,用空间换时间也不失为一个好方法
还可以换个角度来考虑问题,假设巳经有了这个数组的任意两个元素之和的有序数组(长为N^2)那么利用二分查找法,只需用O(2*log2N)就可以解决这个问题当然不太可能去计算这个有序数组,因为它需要O(N^2)的时间但这个思考仍启发我们,可以直接对两个数字的和进行一个有序的遍历从而降低算法的时间複杂度。
1这样只需要在排好序的数组上遍历一次,就可以得到最后的结果时间复杂度为O(N)。两步加起来总的时间复杂度O(N*log2N)下面這个程序就利用了这个思想,代码如下所示:
,那么i最初指向1的位置j最初指向46的位置,比如所求的是Sum=a+ba
1、如果把这个问题中的“两个数字”改成“三个数字”或“任意个数字”时,你的解是什么呢
三个数字:首先还是先对数组进行排序,然后从i=0到n-1进行遍历遍历arr[i]时,在调鼡上面的函数getSumNum(arr , Sum-arr[i])即可
不论是求3个数字还好是m个数字,总是能比较穷举法少一个数量级n比先排序然后二分查找求Sum-arr[i]也要快。
加载中请稍候......
拍照搜题秒出答案,一键查看所有搜题记录
拍照搜题秒出答案,一键查看所有搜题记录
拍照搜题秒出答案,一键查看所有搜题记录