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

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

有人可以帮忙吗?

【问题讨论】:

    标签: arrays algorithm integer


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 2015-12-03
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      相关资源
      最近更新 更多