在 O(1) 空间中的数组中查找重复元素(数字不在任何范围内)

Posted

技术标签:

【中文标题】在 O(1) 空间中的数组中查找重复元素(数字不在任何范围内)【英文标题】:Find the repeating element in an array in O(1) space(Numbers are not in any range) 【发布时间】:2022-01-15 08:45:30 【问题描述】:

给定一个包含 n 个整数的数组,所有数字都是唯一的,但其中一个除外。

如果n为偶数,则重复数重复n/2次

如果 n 为奇数,则重复数重复 (n-1)/2 或 (n+1)/2 次​​p>

重复数在数组中与自身不相邻

编写一个程序来查找重复的数字而不使用额外的空间。

这就是我试图解决问题的方法。

如果 n 是偶数,则有 n/2 个重复元素。此外,重复元素不应相邻。因此,如果说有 6 个元素,则重复 3 个元素。元素可以在索引 0,2 和 4 或 1,3 和 5 处。因此,如果我只检查是否有任何元素在索引 0 和 2 处重复,然后在索引 1 和 3 处重复,我可以获得重复元素。

如果 n 是奇数,则有 2 个选择。

如果 (n+1)/2 个元素重复,那么我们可以只检查索引 0 和 2。例如说有 7 个元素,其中 4 个重复,那么重复元素必须在索引 0,2 ,4 和 6。

但是,当 n 为奇数时,我找不到找到 (n-1)/2 个重复元素的方法。我曾想过使用 xor 和 sum,但找不到方法。

【问题讨论】:

你可以只比较前5个吗?元素并在主题中找到重复项,它们不可能都不同。您甚至可以将它们放入 set 或其他东西中,因为这会使用额外的空间,但只有恒定的空间。 我对 (n-1)/2 的所有奇怪输入持怀疑态度。如果 n 是 3,这将变为 (3-1)/2 = 1,不会重复。所以,你需要从 5 开始。 如果是奇数,则重复 0 和 2 或 1 和 3。但是您总是可以从前 3 个或后 3 个元素中得出重复数字。 F.e. (0,1,0, 2,0,3,0)(1,0,2, 0,3,0,4) @msdev:这个答案对你有帮助吗? @ShridharRKulkarni cmets 帮助了我更多,但我确实通过您的回答了解了一种新算法。实际上,起初我很难意识到它与我的问题有何关系。感谢您的回答 【参考方案1】:

让我们将重复的元素称为“多数”。

Boyer–Moore majority vote algorithm 可以在这里提供帮助。如果存在任何此类元素,则该算法会找到在输入的一半以上元素中重复出现的元素。

但在你的情况下,情况很有趣。大多数可能不会出现超过一半的时间。除了重复的一个和重复的数字不相邻之外,所有元素都是唯一的。此外,多数元素是肯定存在的。

所以,

    对数组中偶数索引处的数字运行多数投票算法。对输入数组进行第二次传递,以验证算法报告的元素是否确实是多数。 如果在上述步骤中我们没有得到多数元素,您可以对数组中奇数索引处的数字重复上述过程。您可以更巧妙地执行第二步,因为我们确定存在多数元素。因此,任何重复的数字都会是结果。

在上面的实现中,有很好的小优化空间。

我想我不应该在这里解释多数投票算法。如果你想让我知道,请告诉我。显然,在不知道这个多数算法的情况下,我们应该能够用一些计数逻辑来做到这一点(这很可能最终与多数算法相同)。但只是它是一个标准算法,我们可以利用它。

【讨论】:

以上是关于在 O(1) 空间中的数组中查找重复元素(数字不在任何范围内)的主要内容,如果未能解决你的问题,请参考以下文章

设计一个 O(n) 算法来找到一个不在 [0,n-1] 范围内的数字 [重复]

在 O(n) 时间内找到数组中的重复元素

我们如何在 O(n) 时间和 O(1) 空间复杂度内找到数组中的重复数字

查找数组中重复的唯一元素+时间复杂度O(n)+空间复杂度O

LintCode(100)删除排序数组中的重复数字

在线性时间和恒定空间中查找数组中缺失和重复的元素