c++ - 这看起来与旧问题相似但不同。给定一个大小为 n 的数组(允许重复的数字),找到缺失的 2 个数字

标签 c++ algorithm search data-structures

<分区>

Possible Duplicate:
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 排序,然后扫描。

或者,扫描并设置一个新的 bool 数组 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

谢谢

最佳答案

如果数据未排序,则无法确保您可以在不查看每个值的情况下找到缺失值。所以,最坏的情况是 O(n) 找到它们。要确定缺少哪些,您可以在 O(1) 中通过计算 nsum(1..n) 的阶乘并将乘积和从总和中减去你遇到的每一项。最后,通过求解 a + b = remaining suma * b = remaining product,您会知道缺少哪些。这是一种作弊,因为您本质上是在进行初步的 O(n) 计算或具有空间影响的表查找。

关于c++ - 这看起来与旧问题相似但不同。给定一个大小为 n 的数组(允许重复的数字),找到缺失的 2 个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8623260/

相关文章:

c++ - 多项式类实现的实现

algorithm - 所有可以用贪心法解决的问题都可以用动态规划来解决吗

c++ - 在 C++ 中迭代具有可变维度大小的 N 维矩阵

search - Thinking Sphinx全应用搜索: filtering by an attribute that only exist in some models

Java 泛型 - Class<?> 构造函数参数问题

c++ - 将 lambda 表达式传递给 lambda 参数 c++11

c++ - 如何使用内在函数将两个 char 数组按元素相乘并将乘法相加为 int?

android - 如何加快 android ndk 构建

java - 可嵌套数据集的字符串压缩与解压

java - 查找 netbeans 项目中的所有公共(public)变量?