编程之美快速寻找满足条件的两个数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编程之美快速寻找满足条件的两个数相关的知识,希望对你有一定的参考价值。
能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解。
分析与解法
方法一:枚举
从数组中任取两个数字,判断是否满足条件。
显然时间复杂度为N(N-1)/2,即O(N2)。
方法二:查找
我们可以把问题进行转化:对于任意数arr[i],查找sum-arr[i]是否在数组中。
(1) 一般查找
在不做处理的情况下直接在数组中查找sum-arr[i]的时间复杂度为O(N),总时间复杂度仍为O(N2)。
(2) 折半查找
显然,如果数组有序,则使用折半查找效率较高。
因此,可以先对数组进行排序,然后采用折半查找,时间复杂度为O(NlogN)。
(3) hash
给定一个数字,根据hash映射表去查找另一个数字是否在数组中,只需要O(1)时间,算法时间复杂度为O(N)。
但这种方法需要空间复杂度为O(N)。
方法三:双指针
首先将数组进行排序;
然后,令 i=0, j=n-1,计算arr[i]+arr[j]:
如果arr[i]+arr[j]>sum,则j--;
如果arr[i]+arr[j]<sum,则i++;
如果相等,则说明找到了满足条件的两个数。
扩展问题
1. 如果把问题中的“两个数字”改成“三个数字”或“任意数字”时,你的解是什么呢?
2. 如果完全相等的一对数字对找不到,能否找出和最接近的解?
3. 把上面的两个题目综合起来,就得到这样一个题目:给定一个数N,和一组数字集合S,求S中和最接近N的子集。想继续钻研下去的读者,可以看一看专业书籍中关于NP,NP-Complete的描述。
以上是关于编程之美快速寻找满足条件的两个数的主要内容,如果未能解决你的问题,请参考以下文章