我有一个二维数组,我知道:
我需要以有效的方式返回在整个数组中出现最多次数的数字。 我已经尝试传遍整个阵列,但效率不高。
这是数组的一个例子。
{
{5, 7, 8},
{6, 6},
{null},
{5, 6, 8, 9}
}
此示例的预期返回值为6.
我想在c ++中获得解释或代码
由于
答案 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> totals
,pair
仅使用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.