首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在O(1)空间中找到数组中的重复元素(数字不在任何范围内)

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

Stack Overflow用户
提问于 2021-12-10 17:20:11
回答 1查看 342关注 0票数 1

给定n个整数数组,所有的数字都是唯一的例外--其中之一。

  • 如果n是偶数,则重复数重复n/2次。
  • 当n是奇数时,重复数重复(n-1)/2或(n+1)/2次数。
  • 重复数字与数组中的自身不相邻。

编写一个程序,在不使用额外空间的情况下找到重复数字。

我就是这样解决这个问题的。

如果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和和,但找不到方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-11 02:39:55

让我们把重复的要素称为“多数”。

Boyer-Moore多数票算法在这里可以帮上忙。如果存在任何这样的元素,则该算法将查找输入中超过一半的元素重复出现的元素。

但就你的情况而言,情况很有趣。大多数可能发生的次数不超过一半。所有元素都是唯一的,除了重复的一个和重复的数字不相邻。此外,多数元素也确实存在。

所以,

  1. 在数组中的偶数索引数字上运行多数投票算法。第二次遍历输入数组,以验证算法报告的元素确实占大多数。
  2. 如果在上面的步骤中我们没有得到多数元素,您可以在数组中的奇数索引上重复上面的过程。您可以更聪明地执行第二步,因为我们确信大多数元素都存在。所以,任何重复的数字都是结果。

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

我想我不应该在这里解释多数表决的算法。如果你想让我这么做,就告诉我。显然,在不知道这个多数算法的情况下,我们应该能够使用一些计数逻辑(这很可能会导致与多数算法相同的结果)。但这只是一个标准的算法,我们可以利用它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70308220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档