C++ 缺少编号面试问题重复
确定1到N范围内缺失值的常见面试问题已经做了一千次了。变化包括2个缺失值,最多K个缺失值 示例问题:Range[1,10](1 2 4 5 7 8 9 10)={3,6} 以下是各种解决方案的示例: 我的问题是,一个缺失值的简单情况是O(n)复杂度,较大情况的复杂度收敛于大约大于O(nlogn)的某个值: 回答这个问题难道不更容易吗?说sort(mergesort)是范围,然后反复观察缺少的元素 此解决方案应不超过O(nlogn),并且能够解决1到N范围以外的问题,如10到1000或-100到+100等 是否有任何理由相信,对于大量缺失值,上述SO链接中的给定解决方案将优于基于排序的解决方案 注:这个问题似乎有很多常见的解决方案,假设只有数论方法。如果在S/E面试中被问到这样一个问题,那么使用计算机科学/算法的方法是不明智的,假设该方法与数论解决方案的复杂性相吻合……< 更多相关链接:C++ 缺少编号面试问题重复,c++,math,computer-science,complexity-theory,C++,Math,Computer Science,Complexity Theory,确定1到N范围内缺失值的常见面试问题已经做了一千次了。变化包括2个缺失值,最多K个缺失值 示例问题:Range[1,10](1 2 4 5 7 8 9 10)={3,6} 以下是各种解决方案的示例: 我的问题是,一个缺失值的简单情况是O(n)复杂度,较大情况的复杂度收敛于大约大于O(nlogn)的某个值: 回答这个问题难道不更容易吗?说sort(mergesort)是范围,然后反复观察缺少的元素 此解决方案应不超过O(nlogn),并且能够解决1到N范围以外的问题,如10到1000或-100到
我们所要做的就是初始化一个包含100个布尔值的数组,对于每个输入,设置对应于输入中每个数字的布尔值,然后逐步报告未设置的布尔值。给定的解决方案在理论上是否优于排序的解决方案取决于N和K。而您的解决方案的复杂性为
O(N*log(N))
,给定的解是O(N*K)
。我认为给定的解决方案是(与排序解决方案一样)能够解决任何范围<代码> [a,b] < /> >只通过将范围<代码> [a,b] < /C> > <代码> [1,n] < /> > < p>您只指定时间复杂度,但是空间复杂度也是很重要的考虑。
问题的复杂性可以用N
(范围的长度)和K
(缺失元素的数量)来表示
在您链接的问题中,使用方程的解决方案是空间中的O(K)(或者更多?),因为每个未知值需要一个方程
还有一个保留点:您可以更改已知元素的列表吗?在许多情况下,这是不可取的,在这种情况下,任何涉及对元素重新排序或使用元素的解决方案都必须首先在空间中复制O(N-K)
我不能比线性解决方案看得更快:您需要读取所有已知元素(N-K)并输出所有未知元素(K)。因此,你不可能在时间上超过O(N)
让我们把解决办法分解一下
- 销毁,O(N)空间,O(N日志N)时间:就地排序
- 保持,O(K)空间?,O(N对数N)时间:方程组
- 保存,O(N)空间,O(N)时间:计数排序
[0,X)
,任何范围都可以,因为任何有限范围都可以通过简单的转换转换转换为[0,X)
形式
编辑:
将排序更改为O(N),需要所有元素都可用才能对其进行排序
经过一段时间的思考,我还提出了另一个解决方案。如前所述,当N(急剧)增长时,所需的空间可能会爆炸。但是,如果K很小,那么我们可以使用间隔更改列表的表示形式:
{4,5,3,1,7}
[1,1]U[3,5]U[7,7]
最坏的情况很简单:N/2个区间(奇数对偶数)。不过我无法计算出平均情况。我的直觉告诉我它应该比O(N)好,但我并不那么相信。如果给你的范围远远超过,那么在这种情况下,范围是[1,10]您可以使用给定的范围和数字执行XOR运算。因为XOR是交换运算。您将只剩下{3,6}
(1234568910)XOR(12457910)={3,6}如果有总的N元素,其中每个数字x都是1100。这是怎么回事
最后\u元素\u的布尔值数组
在for
循环中,标记所有在