查找频率最高的元素(如果可能的话,是最小的元素)及其在整数数组中的出现次数
Find highest frequent element (the smallest one if possible) and its occurrences in integer array
问题:找到 2 个东西
- 在给定的未排序整数数组
中出现次数最多
- 出现次数最多的元素并且如果有不止一个元素满足(具有相同的最高出现次数)结果是最小的元素。
请尽可能简单地解决问题,不要使用指针或任何高级容器,如 hashtable、pair 或 map(我是初学者)
例如:
{1, 2, 8, 2, 5, 0, 5}
答案是2和2(元素2
和5
都出现了两次但是2
是最小的)
这是代码,但它只找到出现次数最多的那个。
int A[] = {1, 2, 8, 2, 5, 0, 5};
int N = 7;
int maxCount = 0;
int minMode = 0;
for (int i = 0; i <= N - 1; i++) {
int count = 0;
for (int j = 0; j <= N - 1; j++) {
if (A[i] == A[j])
count++;
}
if (count >= maxCount)
{
maxCount = count;
minMode = A[i];
}
}
cout << maxCount << " " << minMode << endl;
这个问题是O(n)的,但是如果不使用结构,它就变成了O(n²)。
这是一个简单的 O(n²) 解决方案:
int main(){
int A[7] = {1, 2, 8, 2, 5, 0, 5};
int value, occurrences;
int maxValue = 99999999, maxOccurrences = 0;
for(int i = 0; i < 7; i++){
value = A[i]; occurrences = 0;
for(int j = 0; j < 7; j++) if(A[j] == value) occurrences++;
if(occurrences > maxOccurrences){
maxValue = value; maxOccurrences = occurrences;
}
else if(occurrences == maxOccurrences){
if(value < maxValue) {
maxValue = value;
maxOccurrences = occurrences;
}
}
}
cout<<maxValue<<" occurs "<<maxOccurrences<<" times"<<endl;
}
我们将 maxValue 初始化为一个非常大的数字,只是为了说明如果两个数字出现的次数相同,则选择最小的数字。
然后我们只是迭代和计数。
一个可能的优化是:假设你在数组中搜索5。总是你找到一个 5,将出现次数加到数量上并将数组值设置为 -1,所以当你最终从它开始时,你知道它是 -1 并且你可以跳过那个元素。
问题:找到 2 个东西
- 在给定的未排序整数数组 中出现次数最多
- 出现次数最多的元素并且如果有不止一个元素满足(具有相同的最高出现次数)结果是最小的元素。
请尽可能简单地解决问题,不要使用指针或任何高级容器,如 hashtable、pair 或 map(我是初学者)
例如:
{1, 2, 8, 2, 5, 0, 5}
答案是2和2(元素2
和5
都出现了两次但是2
是最小的)
这是代码,但它只找到出现次数最多的那个。
int A[] = {1, 2, 8, 2, 5, 0, 5};
int N = 7;
int maxCount = 0;
int minMode = 0;
for (int i = 0; i <= N - 1; i++) {
int count = 0;
for (int j = 0; j <= N - 1; j++) {
if (A[i] == A[j])
count++;
}
if (count >= maxCount)
{
maxCount = count;
minMode = A[i];
}
}
cout << maxCount << " " << minMode << endl;
这个问题是O(n)的,但是如果不使用结构,它就变成了O(n²)。
这是一个简单的 O(n²) 解决方案:
int main(){
int A[7] = {1, 2, 8, 2, 5, 0, 5};
int value, occurrences;
int maxValue = 99999999, maxOccurrences = 0;
for(int i = 0; i < 7; i++){
value = A[i]; occurrences = 0;
for(int j = 0; j < 7; j++) if(A[j] == value) occurrences++;
if(occurrences > maxOccurrences){
maxValue = value; maxOccurrences = occurrences;
}
else if(occurrences == maxOccurrences){
if(value < maxValue) {
maxValue = value;
maxOccurrences = occurrences;
}
}
}
cout<<maxValue<<" occurs "<<maxOccurrences<<" times"<<endl;
}
我们将 maxValue 初始化为一个非常大的数字,只是为了说明如果两个数字出现的次数相同,则选择最小的数字。
然后我们只是迭代和计数。
一个可能的优化是:假设你在数组中搜索5。总是你找到一个 5,将出现次数加到数量上并将数组值设置为 -1,所以当你最终从它开始时,你知道它是 -1 并且你可以跳过那个元素。