您将获得一系列元素。其中一些/全部是重复的。在0(n)时间和0(1)空间中找到它们。输入属性 - 数字在1..n范围内,其中n是数组的限制。
答案 0 :(得分:4)
如果O(1)存储是对额外内存的限制,而不是无法修改输入数组的指示,则可以通过在迭代元素时进行排序来执行此操作:将每个错位元素移动到其中“正确”的地方 - 如果它已被正确的数字占用,则将其打印为副本,否则在继续迭代之前,将“不正确”的现有内容正确放置并正确放置。这可能反过来要求校正其他元素以产生空间,但是存在最多1个堆栈并且校正步骤的总数限制为N,加到N步迭代中,得到2N仍然是O(N)。
答案 1 :(得分:1)
由于数组中的元素数量和数组的范围都是基于n
变量的,我不相信你能做到这一点。我可能错了,我个人对此表示怀疑,但之前我错了: - )
编辑:看起来我可能又错了:-)看到Tony的回答,我相信他可能已经钉了它。一旦有足够的人同意我的话,我会删除这个答案,或者它被过多地投票: - )
如果范围已修复(例如,1..m
),则可以这样做:
dim quant[1..m]
for i in 1..m:
quant[m] = 0
for i in 1..size(array):
quant[array[i]] = quant[array[i]] + 1
for i in 1..m:
if quant[i] > 1:
print "Duplicate value: " + i
这很有效,因为在大多数算法中,您通常可以与空间进行权衡。但是,因为范围也取决于输入值,所以空间和时间之间的正常权衡是不合理的。