我想在数组中找到多数(大多数时间出现的数字)。
我有一个排序数组,并使用以下循环:

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]),则将查找具有最大计数的第一个值(按排序顺序)。

09-26 15:35