编程之美快速寻找满足条件的两个数

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的描述。

以上是关于编程之美快速寻找满足条件的两个数的主要内容,如果未能解决你的问题,请参考以下文章

编程之美之高速寻找多个数满足给定条件

编程之美数组分割

编程之美寻找数组中的最大值和最小值

编程之美之2.5 寻找最大的K个数

编程之美 2.10寻找数组中的最大最小值

编程之美----字符串移位包含的问题