数组A包含[0,n-1]范围内的n-1个唯一整数,也就是说,此范围内有一个不在A中的数字。设计一个O(n)算法来查找该数字。除阵列A本身外,仅允许使用O(1)额外空间。
需要一些帮助来解决这个问题,
答案 0 :(得分:5)
给出这些值:一个是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)
这是另一种方法: