设计一个 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的平方)时间的算法,找出由n个数组成的序列的最长单调递增子序列