设计一个 O(n) 算法来找到一个不在 [0,n-1] 范围内的数字 [重复]

Posted

技术标签:

【中文标题】设计一个 O(n) 算法来找到一个不在 [0,n-1] 范围内的数字 [重复]【英文标题】:Design an O(n) algorithm for find one number not within range [0,n-1] [duplicate] 【发布时间】:2014-11-05 05:31:15 【问题描述】:

数组 A 在 range [0,n-1] 中包含 n-1 唯一整数,也就是说,此范围中有一个数字不在 A 中。设计一个O(n) 算法来查找该数字。除了数组 A 本身之外,您只能使用 O(1) 额外空间。

有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

将0到n-1的数相加,然后求数组的和,缺失的数为sum - sum of array

解释:求和如果 0+1+2+...+n-1 并且数组也包含所有这些数字,除了一个,所以当你添加到 0+1+2+...+n-1 时,所有的数组中带有“-”前缀的数字,每个数字将取消他的“+”对应物,因此您将留下数组中没有对应物的“+”,因此这是缺少的数字

注意: 存储一个数字是 log(n) 位,但在大多数地方(我见过)他们不以位分辨率说话,存储一个数字是 O(1) 空间,所以它取决于你的问题是如何定义的

【讨论】:

值得注意的是,添加n 整数并不占用一个常量空间,而是一个log(n) 空间。表示数字n所需的位数是log2(n) 这取决于你认为的空间复杂度,据我所知存储一个数字是 O(1) 但你是对的,这取决于它在问题中的定义方式 太棒了。这就是为什么你应该小心这个作为面试问题的原因。如果你不仔细研究它,如果一个聪明的候选人出现,你可能看起来像个傻瓜。 这是一个很好的答案。不过我有一点点改进。改进是当缺失数为零时。您的算法不会检测到它。这个问题的解决方案是给两个(数组和范围)中的每个数字加 1(或称其为移位 1)。因此,解决问题的新算法是:summationOfRange = n(n+1)/2; summationOfArray = n - 1 + sum(array); missingNumber = summationOfRange - summationOfArray - 1;。就是这样。【参考方案2】:

给定列表 a(大小 100)和 b(大小 99)在 0-99 范围内随机排序的唯一整数。

a = RandomSample[Range[0, 99]]
b = Take[RandomSample[Range[0, 99]], 99]

b 中查找缺失的元素。

element = Total[a]-Total[b]

使用的语言是 Mathematica。

【讨论】:

以上是关于设计一个 O(n) 算法来找到一个不在 [0,n-1] 范围内的数字 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 O(n) 时间内找到数组中的 10 个最大整数

设计一个采用 O(n log n) 确定的分治算法

设计一个O(n的平方)时间的算法,找出由n个数组成的序列的最长单调递增子序列

在列表中找到一个下降。这可以在 O(log n) 中完成吗?

算法设计与分析「通关指南」

什么是Prim算法?