有人可以向我解释一下这是怎么做的吗?这是我想要了解的代码片段:
// Iterate though input array, for every element
// arr[i], increment arr[arr[i]%k] by k where k is less than of equal to number of elements
// ie. k <= n
for (int i = 0; i< n; i++)
arr[(arr[i]%k)] += k;
// Find index of the maximum repeating element
int max = arr[0], result = 0;
for (int i = 1; i < n; i++)
{
if (arr[i] > max)
{
max = arr[i];
result = i;
}
}
我意识到当我们第一次遍历数组时
在我们完成之后,最高数字元素的索引是我们正在寻找的最频繁的数字。
我理解这些步骤,但我不理解逻辑,特别是围绕模数和索引与值。任何解释将不胜感激!
答案 0 :(得分:1)
该解决方案仅在保证0 <= arr[i] < k
或arr[i]
的范围位于k
值的区间内时才有效。
该算法使用相同的数组(arr
)作为频率散列映射来存储特定值的出现次数,尽管使用模运算。任何以除数递增的数字每次都会给出相同的余数。每次发现出现时,arr[i] % k
处的元素增加k。这类似于通过1
递增频率散列映射。在迭代结束时,所有元素将增加(number of times value occurs) * k
。找到最大元素,将为您提供最多的元素。
这个算法中有一些假设你还没有提到:
0 < arr[i] <= k
k <= n
(count of occurences) * k + arr[i]
大于INT_MAX
,则结果可能会溢出。