找到O(nlogn)和O(logn)附加空间中的最小正数

时间:2016-11-08 23:52:04

标签: arrays algorithm

这是一个众所周知的问题的略微修改版本,但我似乎无法弄清楚这一点。

  

我们给出了一个大小为n的数组,其中包含未排序的正数序列,没有重复项。我正在尝试找到数组中未包含的最小正数,但我无法以任何方式对数组进行排序或编辑。整个事情应该是O(nlogn)时间和O(logn)空间复杂度。

我能想到的所有解决方案都是多项式时间复杂度。

1 个答案:

答案 0 :(得分:10)

您可以通过二进制搜索答案来解决此问题而无需修改数组。请记住,我们正在寻找数组中最小正整数。这意味着答案不能大于n + 1,因为我们的数组中只有n个数字。所以我们只需要在1和n + 1之间进行二分搜索即可找到答案。

在我们的二分搜索中,我们想回答这个问题:对于给定的数字k,我们的数组中是否包含每个整数1到k?因为没有重复,我们可以通过计算数组中小于或等于k的元素数来解决这个问题。如果计数是k,则每个这样的整数都在我们的数组中;否则,至少有一个人失踪。

所以我们二元搜索找到k的最小值,其中上面的属性为false。二进制搜索需要O(log n)次迭代,并且每次迭代花费O(n)时间总共O(n log n)次。空间实际上是O(1),因为我们需要的只是一个用于计数的变量。