寻找1到2之间的总和

时间:2014-11-04 19:39:33

标签: algorithm

如果n 正实数数字,则任务是对以下问题提供“是”或“否”答案: “是否存在一对数字x和y,使得1 <= x + y <= 2。

显而易见的解决方案是对所有需要O(nlogn)的数字进行排序。现在,可以在O(n)时间内检查对。

然而,预计这个问题将在恒定的空间和线性时间内得到解决。任何见解?

2 个答案:

答案 0 :(得分:3)

只有0到2之间的数字才能参与获胜对。其他人可以被忽略。

每个此类号码x都可以在1-x2-x之间的列表中创建一对包含一个额外号码的号码。 在列表中进行处理时计算并维护可接受的边界。在任何给定时间,可接受的下一个值的间隔不能超过两个,因为可接受的下一个值的所有间隔都包含在-1和2之间,并且宽度为1.因此,完成一对的可接受的下一个值可以用常量表示空间。

如果列表中出现的数字是最多可接受的下一个值的两个时间间隔之一,则立即回答“是”。如果你到达列表的末尾而没有遇到这种情况,请回答否。

示例:0.1,0.5,2.0 ......

  • 启动时,可以显示并完成一对的值集是空集。

  • 读完0.1后,如果它们现在出现,那么完成一对的一组值是[0.9,1.9]。

  • 0.5不属于可以完成一对的值集。但是,在阅读之后,[0.5,1.5]中的值可以完成一对。由于我们已经设置了[0.9,1.9],因此可以完成一对的新值集合为[0.5,1.9]。

  • 2.0不属于可以完成一对的值集。但是,我们现在可以读取[-1,0]中的任何值来完成一对。今后可以读取以完成一对的新值集是[-1,0]∪[0.5,1.9]。

  • 等......

答案 1 :(得分:3)

我喜欢Pascal Cuoq这个问题的算法,我认为这是一个很好的优雅解决方案。我想在这里发布一种不同的方法,对解决方案提供略微不同的观点。

首先,这是算法:

  1. 对输入进行一次传递并跟踪以下内容:1到2之间的最小数字,小于1的最小数字,小于1/2的最大数字,以及介于1/2和1之间的数字
  2. 如果1到2之间的最小数字和小于1的最小数字之和小于2,则输出YES。
  3. 否则,如果1/2和1之间至少有两个数字,则输出YES。
  4. 否则,如果1/2和1之间没有数字,则输出NO。
  5. 否则,如果小于1/2的最大数字和1/2和1之间的数组中的唯一数字之和大于1,则输出YES。
  6. 否则,输出NO。
  7. 这里有一个证明为什么会这样做的证据。正如Pascal所说,我们只关心[0,2]范围内的数字;超出此范围的任何事物都不能成为1到2之间的事物的一部分。我们可以进行案例分析,以考虑总和中可能的数字是什么。

    首先,其中一个数字可能在(1,2)范围内。我们在此范围内不能有两个数字,因此另一个数字必须在[0,1]范围内。在这种情况下,我们可以取[0,1]范围内的最小数字,看看当我们在范围(1,2)中添加最小数字时会发生什么:如果它们的总和在1和2之间,我们&# 39;重新做;否则,任何涉及范围(1,2)中的数字的和都不能作为求和的一部分。

    否则,求和必须纯粹由范围[0,1]中的数字组成。请注意,至少有一个数字必须在[1 / 2,1]范围内,否则它们的总和不能至少为1.另请注意,此范围内任意两个数字的总和不会超过2.在这种情况下,如果[1/2,1]范围内有两个数字,则它们的总和满足条件,我们就完成了。如果[1/2,1]范围内有0个数字,则没有解决方法。否则,我们可以尝试将范围[0,1 / 2]中的最大数字添加到范围[1 / 2,1]中的一个数字,并查看总和是否至少为1.如果答案是肯定的,我们和#39;有了这对;如果没有,答案是否定的。

    我非常喜欢Pascal的算法而不是这个算法,但我想我会发布这个来展示如何在这里使用案例分析。

    希望这有帮助!