我找到了一种方法,可以在n个元素的数组中找到重复项,范围从0到n-1。
Traverse the array. Do following for every index i of A[].
{
check for sign of A[abs(A[i])] ;
if positive then
make it negative by A[abs(A[i])] = -A[abs(A[i])];
else // i.e., A[abs(A[i])] is negative
this element (ith element of list) is a repetition
}
此方法正常。但我不明白怎么做。有人可以解释一下吗?
我基本上是在寻找这个算法的证明或更简单的理解!
答案 0 :(得分:4)
你基本上是通过使用每个数组元素的符号位作为一位标志的数组来表示元素的存在与否。这可能会或者可能不会比简单地使用单独的位设置数组更快,但它肯定会利用您使用无符号值的有符号表示(int)的特殊情况,因此您有一个额外的未使用位可以使用在每一个上。例如,如果您的值已签名,则无效。
答案 1 :(得分:3)
该算法将附加信息存储在数组中每个数字的符号中。
登录A[i]
存储在处理过程中是否先发生i
:如果是负数,则会发生一次。
注意:“元素范围从0到n-1。” - 哦,你不能将标志存储在0
中,所以这不是一个正确的算法算法。
答案 2 :(得分:0)
参见http://www.geeksforgeeks.org/find-the-two-repeating-elements-in-a-given-array/ 方法5.
那里的例子可能对你有帮助。