O(n)算法,找到缺失的整数

时间:2012-09-05 13:43:53

标签: algorithm data-structures big-o

数组A包含[0,n-1]范围内的n-1个唯一整数,也就是说,此范围内有一个不在A中的数字。设计一个O(n)算法来查找该数字。除阵列A本身外,仅允许使用O(1)额外空间。

需要一些帮助来解决这个问题,

3 个答案:

答案 0 :(得分:5)

  1. 对数组求和。
  2. 计算expected sum using arithmetic progression formula
  3. 给出这些值:一个是0 + 1 + 2 + ... + n-1,另一个是你的实际元素的总和 - 想想它们彼此之间的差异,另一个没有的是什么。确保你知道,答案是微不足道的。

    编辑:(理论评论):
    请注意sum(array)需要2*log_2(max(arr))位。因此,如果您的元素都是32位整数,则最多需要64位来表示总和。
    从纯粹的理论方法 - 它不是O(1)。但是,您可以使用数组本身(它包含多于2*log_2(max(arr))位)来存储总和。

答案 1 :(得分:1)

使用使用-1初始化的其他tmp变量,然后使用tmp作为位置n对数组进行排序:

function find_missing(array)
begin
  tmp := -1
  i := 0;
  while i<length(array)
    if (array[i] = -1) or (array[i] = i) then
      // either on a cell with the right number or 
      // a candiate for the missing number, just go on
      i := i + 1
    else if array[i] = n then
      // use tmp as the nth cell
      array[i]=tmp
      tmp=n
    else
      // swap the value of the current cell with the value
      // of the cell were the value i should be
      swap(array, i, array[i])
    end if
  end while
end

-1应该指向缺少的数字。

答案 2 :(得分:0)

这是另一种方法:

  1. 设置一个临时变量Number with 0
  2. 对于数组中的每个元素,设置Number = Number XOR元素
  3. 对于每个数字M,M> N和M < 2 **(ceil(log2(N))set Number = Number XOR M
  4. 缺少号码是号码