我想在数组中找到多数(大多数时间出现的数字)。
我有一个排序数组,并使用以下循环:
for(int k = 1;k < length;k++)
{
if(arr[k-1] == arr[k])
{
count++;
if(count > max)
{
max = count;
maxnum = arr[k-1];
}
} else {
count = 0;
}
}
要么
for(int h=0;h<length;h++)
{
for(int l=1;l<length;l++)
{
if(arr[h] == arr[l])
{
count++;
if(count > max)
{
max = count;
maxnum = arr[h];
}
} else count = 0;
}
}
他们很相似。当我在小型阵列上尝试它们时,一切似乎都还可以。但是在具有N个元素0 这是错误http://ideone.com/y2gvnX的解决方案。我知道有更好的算法可以找到多数,但是我只需要知道我的错误在哪里。
我真的找不到它:(将非常感谢您的帮助!
最佳答案
您的第一个算法对我来说看起来是正确的。每次循环中,第二个代码(链接代码使用的代码)每次都需要进行一些初始化。同样,内部循环不需要每次都从1
开始;它可以从h + 1
开始:
for(int h=0; h<length; h++)
{
count = 1; // for the element at arr[h]
for(int l=h + 1; l<length; l++)
{
if(arr[h] == arr[l])
{
count++;
}
}
if(count > max)
{
max = count;
maxnum = arr[h];
}
}
第一种算法对排序数组要好得多。即使对于未排序的数组,对数组(或其副本)进行排序然后使用第一种算法比使用第二种算法会更便宜。
请注意,如果存在联系(例如,根据@Rohit的注释用于数组
[1, 1, 2, 2, 3]
),则将查找具有最大计数的第一个值(按排序顺序)。