【发布时间】:2014-02-17 01:06:03
【问题描述】:
给定一个大小为 n 的数组 A,以及 b-a+1=n 的两个数字 a 和 b,我需要确定 A 是否包含 a 和 b 之间的每个数字(恰好一次)。
例如,如果 n=4 且 a=1,b=4,那么我正在查看 A 是否是 [1,2,3,4] 的重排。
实际上,我需要使用 O(1) 空间(无哈希表)来执行此操作。
我的第一个想法是对 A 进行排序,但我必须在不重新排列 A 的情况下这样做,所以就这样了。
我的第二个想法是遍历 A 一次,将条目相加并检查它们是否在正确的范围内。最后,我必须得到正确的总和(对于 a=1,b=n,这是 n(n+1)/2),但这并不总能捕获所有内容,例如[1,1,4,4,5] 通过了 n=5,a=1,b=5 的测试,但不应该。
我唯一可行的想法是遍历数组 n 次,确保每个数字只看到一次。有更快的解决方案吗?
【问题讨论】:
-
n 有多大?为什么需要 O(1) 空间?
-
听起来像是面试题。
-
不是面试问题或作业。对于大小,n 可以达到 10^9 或更多。我的解决方案有效,但必须有更好的解决方案。
-
O((b-a) * n)(最坏情况)的执行顺序是否符合您的期望? -
另见:mathoverflow
标签: c algorithm permutation