快速寻找满足条件的两个数

问题:快速找出一个数组中的两个数字,让这两个数字之和等于一个固定值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解。

解法1:直接枚举,计算两两数字之和,时间复杂度为O(N2)。

解法2:找sum-arr[i]是否存在。
对于每个数字arr[i],查找应对的sum-arr[i]是否在数组中,那么关键就在于如何提高查找的效率。
为了提高查找效率,我们可以将数组排序,这需要O(Nlog2N)的时间,使用二分查找等方法进行查找,需要O(log2N),总的时间复杂度是O(Nlog2N)。
另外,还有更快的查找方法:Hash表。给定一个数字,根据hash映射查找另一个数字是否在数组中,只需用O(1)时间。但这种方法需要额外增加O(N)的hash表存储空间。总体的算法复杂度为O(N)。

解法3:当题目要求返回两个下标时,则比较高效的办法是:先排序,然后在一个循环体里使用两个循环变量进行反向遍历,并且这两个变量遍历的方向是不变的,从而保证遍历算法的时间复杂度为O(n)。
首先对数组进行排序,时间复杂度为O(N*log2N)。
令i=0,j=n-1,看arr[i]+arr[j]是否等于sum,如果是,则结束,如果小于sum,则i++,如果大于sum,则j--。这样只需要在排好的数组上遍历一次,就可以得到最后的结果。

资料整理自《编程之美》,纯属菜鸟笔记。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容