这看起来与旧问题相似但不同。给定一个大小为 n 的数组(允许重复的数字),找到缺少的 2 个数字 [重复]
Posted
技术标签:
【中文标题】这看起来与旧问题相似但不同。给定一个大小为 n 的数组(允许重复的数字),找到缺少的 2 个数字 [重复]【英文标题】:This looks similar but different from old questions. Given an array (duplicated numbers allowed) of size n, find the missing 2 numbers [duplicate] 【发布时间】:2012-01-27 05:43:54 【问题描述】:可能重复:Easy interview question got harder: given numbers 1..100, find the missing number(s)
**不,它是重复的!给定数组中的某些数字可能会重复。请参考我帖子底部的示例。谢谢 !!! **
给定一个大小为 n 的数组,其中包含 1 到 n 范围内的数字。除 2 个数字外,每个数字至少出现一次。找出缺失的数字。
例如A = [2, 4, 5, 4, 6, 5],缺失的数字是3和1。
我的解决方案:
用 O(n lg n) 对 A 进行排序,然后扫描。
或者,扫描并设置一个新的布尔数组B来标记给定数组中的数字是否出现,例如B[A[i]] = 真或假。然后,将 bool 数组扫描到索引为缺失元素的 false 元素。时间 O(n) 但空间 O(n)。
是否存在时间 O(n) 和空间 O(1) 的解?
注意: 求和和乘法的方法不起作用。
例如,给定 A [2, 3, 2, 3],缺少的数字是:1 和 4。
假设缺失的数字是 x 和 y。
我们无法得到:
x + y = 1 到 n 的总和 - A 的总和
x * y = 1 到 n 的乘积 / A 的乘积
1 + 4 != 10 - 10
1 * 4 != 24/36
谢谢
【问题讨论】:
@Marlon:有趣的阅读,感谢您的链接。 :) 您的 Big-O 符号已关闭。第一个是 O((n logn)n)。第二个是 O(n2)。我认为第一个解决方案可能是最快的。 【参考方案1】:如果数据未排序,则无法确保您可以在不查看每个缺失值的情况下找到缺失值。因此,最坏的情况是 O(n) 才能找到它们。要确定缺少哪些,您可以在 O(1) 中通过计算 n
和 sum(1..n)
的阶乘并除以乘积并从遇到的每个项的总和中减去。最后,通过求解a + b = remaining sum
和a * b = remaining product
,您将知道哪些缺失。这是一种作弊,因为您实际上是在进行初步的 O(n) 计算,或者是对空间有影响的表查找。
【讨论】:
“你可以通过计算 n 的阶乘在 O(1) 中做到这一点” - 以及如何在 O(1) 中计算?【参考方案2】:codekaizen 的想法可以被调整以使其可行:
计算 U = 所有元素的和,V = 所有元素的平方和。 如果 a 和 b 是缺失的元素,我们有
a + b = n(n+1)/2 - U = W, say
a^2 + b^2 = n(n+1)(2n+1)/6 - V = X, say
在第二个等式中代入 b = W - a 得到
a^2 + (W - a)^2 = X
这是a中的一个二次方程,你可以求解。
【讨论】:
注意:与一些经典题不同。在这里,允许重复的数字。求和和乘法的方法不起作用。例如,给定 A [2, 3, 2, 3],缺失的数字是:1 和 4。假设缺失的数字是 x 和 y。我们不能得到: x + y = 1 到 n 的总和 - A 的总和,x * y = 1 到 n 的乘积 / A 的乘积,1 + 4 != 10 - 10 ,1 * 4 != 24/36以上是关于这看起来与旧问题相似但不同。给定一个大小为 n 的数组(允许重复的数字),找到缺少的 2 个数字 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
JSF inputText 和 inputSecret 大小不同
FluentAssertions - 比较包含名称相似但类型不同的属性的对象