给定n个整数数组,所有的数字都是唯一的例外--其中之一。
编写一个程序,在不使用额外空间的情况下找到重复数字。
我就是这样解决这个问题的。
如果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和和,但找不到方法。
发布于 2021-12-11 02:39:55
让我们把重复的要素称为“多数”。
Boyer-Moore多数票算法在这里可以帮上忙。如果存在任何这样的元素,则该算法将查找输入中超过一半的元素重复出现的元素。
但就你的情况而言,情况很有趣。大多数可能发生的次数不超过一半。所有元素都是唯一的,除了重复的一个和重复的数字不相邻。此外,多数元素也确实存在。
所以,
在上面的实现中,有一个很好的小优化空间。
我想我不应该在这里解释多数表决的算法。如果你想让我这么做,就告诉我。显然,在不知道这个多数算法的情况下,我们应该能够使用一些计数逻辑(这很可能会导致与多数算法相同的结果)。但这只是一个标准的算法,我们可以利用它。
https://stackoverflow.com/questions/70308220
复制相似问题