这看起来与旧问题相似但不同。给定一个大小为 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) 中通过计算 nsum(1..n) 的阶乘并除以乘积并从遇到的每个项的总和中减去。最后,通过求解a + b = remaining suma * 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 大小不同

动态规划之切棍子问题

将 n 个可变高度图像拟合到 3 个(相似长度)列布局中

FluentAssertions - 比较包含名称相似但类型不同的属性的对象

LeetCode 448.找到所有数组中消失的数字 - JavaScript

如何找到两个不同大小的分布之间的相似性?