最大显示二维数组中的数字

时间:2016-06-25 10:25:06

标签: c++ arrays

我有一个二维数组,我知道:

  • 行数和每行的长度
  • 每行只包含正数
  • 每行都已排序
  • 不使用辅助阵列 - 不用于数据结构

必需输出

我需要以有效的方式返回在整个数组中出现最多次数的数字。 我已经尝试传遍整个阵列,但效率不高。

这是数组的一个例子。

{
  {5, 7, 8},
  {6, 6},
  {null},
  {5, 6, 8, 9}
}

此示例的预期返回值为6.

我想在c ++中获得解释或代码

由于

4 个答案:

答案 0 :(得分:0)

为了计算元素在数组中出现的次数,使用递归的类似问题显示为here

由于您提到了效率,因此在计算元素在数组中的存在次数(如果未排序)之前,按升序或递减顺序对数组进行排序会有所帮助。虽然如您的示例中所示,对于较小的输入大小,但它不会产生太大的影响。

答案 1 :(得分:0)

您可以使用地图来记录重复次数和当前最大值

map<int, int> temp;
int currentMax= -999999,maxCount=0;
for(i=0; i< numberOflines ;i++)
{
        for(j=0;j< array[i].length;j++)
        {
            int newCount = ++temp[array[i][j]];
            if (maxCount < newCount) {
                 maxCount = newCount;
                 currentMax = array[i][j];
            }
        }
}

答案 2 :(得分:0)

由于需要C / C ++解决方案,因此可以使用2D阵列。 所有缺失的值都可以用-1表示(或者在搜索中涉及的有效数字中不期望的任何数字)。 所以一个空行可以用-1表示。请参阅下面的代码。 因为在C / C ++中,2D数组在存储器中连续表示。所以我们可以将2D数组转换为1D数组。 现在我们可以对数组进行排序。排序后,所有&#39; -1&#39;将在开始时可以丢弃。 从剩下的元素中我们可以找到元素的最大频率。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int compare (const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );
}

int main()
{
    int i, prev, max = -1, count = 0, maxvalue = -1;
    int a[4][4] = {{5, 7, 8, -1}, {6, 6, -1, -1}, {-1, -1, -1, -1}, {5, 6, 8, 9}};
    //int a[4][4] = {{-1, -1, -1, -1}, {-1, -1, -1, -1}, {-1, -1, -1, -1}, {-1, -1, -1, -1}};

    int *b = (int*)a;
    int total = sizeof(a) / sizeof(int);

    qsort(b, total, sizeof(int), compare);

    for(i = 0; i < total; ++i)
    {
            if(b[i] != -1)
            {
                    break;
            }
    }

    //printf("\n");

    i = i + 1;

    prev = -1;
    count = 0;
    if(i < total)
    {
            prev = b[i];
            count = 1;
    }
    for(i = i + 1; i < total; ++i)
    {
            //printf("prev=%d, b[i]=%d, max=%d, count=%d\n", prev, b[i], max, count);

            if(prev == b[i])
            {
                    count++;;
            }
            else
            {
                    if(max < count)
                    {
                            max = count;
                            maxvalue = prev;
                    }
                    prev = b[i];
                    count = 1;
            }
    }

    if(max != -1)
    {
            printf("Max Occurence of %d = %d\n", maxvalue, max);
    }
    else
    {
            printf("All the rows are of zero length\n");
    }

    return 0;
}
//Output:
Max Occurence of 6 = 3

答案 3 :(得分:0)

首先,你输入的内容是非法的:

{
    {5, 7, 8},
    {6, 6},
    {null},
    {5, 6, 8, 9}
}

null不是由C ++定义的,即使它被定义为0,它也必须被解释为int(0),而不是我认为你想要的空子数组。

我猜你打算隐含的输入应该是这样的:

const initializer_list<int> a[] = {{5, 7, 8}, 
                                   {6, 6},
                                   {},
                                   {5, 6, 8, 9}};

您需要为任何数组中的每个数字维护一个总数。最好的方法是使用map<int, int> totalspair仅使用a的确切数量构建,因为pair中有唯一元素。每个for(const auto& i : a) for_each(cbegin(i), cend(i), [&](const auto& it){ totals[it]++;}); 的第二个元素将是到目前为止看到的那个元素的计数。您可以通过执行以下操作填充它:

totals

填充cout << max_element(cbegin(totals), cend(totals), [](const auto& lhs, const auto& rhs){return lhs.second < rhs.second;})->first << endl; 后,您只需找到其最大值:

|----|
|    | Very short text.
|----|

|----| Long long long long long long long long
|    | long long long long long long long long
|----| long long long long long long long text.

Live Example