【问题标题】:O(n) algorithm, find the missing integerO(n) 算法,找到缺失的整数
【发布时间】:2012-09-05 13:43:52
【问题描述】:

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

这个问题需要一些帮助,

【问题讨论】:

标签: algorithm data-structures big-o


【解决方案1】:
  1. 对数组求和。
  2. 计算expected sum using arithmetic progression formula

给定这些值:一个是0 + 1 + 2 + ... + n-1,另一个是实际元素的总和 - 想想它们之间的区别,一个有什么,另一个没有。确保你知道它,答案是微不足道的。

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

【讨论】:

  • awww,来吧伙计,你为什么马上给出正确答案,这太容易了,让 OP 为他/她自己考虑一下 ;)
  • @nyarlathotep:建议采纳,我将答案编辑为更多提示然后回答。
  • 是的,很好的编辑:D。毕竟可能是家庭作业,我们不想让它变得太容易;)
  • 这使用 O(lg n) 额外空间,因为求和所需的空间不独立于 n
  • @chepner 我不同意。您可以使用数组本身(不计入附加值)。假设我们使用某个固定的整数大小来表示元素(因此数组中的所有元素占用相同的位数),前 2 个元素足以对数组求和,给我们留下O(1) 额外的空间。 (如果没有这个假设,我们也可以拟合它,但我们可能需要更多元素)。
【解决方案2】:

使用额外的tmp 变量初始化为-1,然后使用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 应该指向丢失的数字。

【讨论】:

    【解决方案3】:

    这是另一种方法:

    1. 用 0 设置临时变量 Number
    2. 对于数组中的每个元素,设置 Number = Number XOR element
    3. 对于每个数字 M,M > N 和 M
    4. 缺少数字是数字

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-04
      • 1970-01-01
      • 2012-09-26
      • 2011-05-11
      • 2013-10-22
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多