1.问题描述
例如:数组a={2,3,1,5,5,5,5,7,8,1},元素2、3、7、8各出现1次,1出现两次,5出现4次,则重复次数最多的元素为5.
2. 方法与思路
2.1 以空间换时间,索引法
定义一个数组int cnt[MAX]
,将其元素全部初始化为0。然后遍历数组a,执行cnt[a[i]]++
操作。最后在cnt数组中找最大的数,对应的数即为重复次数最多的数。
代码示例如下:
//以空间换时间,索引法
int MaxFreq_index(int a[],int n)
{
int i,j;
int max = a[0];
//求出最大值,以分配计数数组空间
for(i = 1; i < n; i++)
if(a[i] > max)
max = a[i];
int *cnt = new int[max];
for(i =0; i < max; i++) cnt[i]=0;
max = 0;
for(i = 0; i < n; i++)
{
if( ++cnt[a[i]] >= cnt[max] )
{
max= a[i];
}
}
return max;
}
2.2 map映射法
使用map键值对来记录元素的出现次数,键为元素,值为键对应出现的次数。时间复杂度为o(n)。
#include <map>
...
int MaxFreq_map(int a[],int n)
{
map<int,int> mp;
int i,maxfreqNum=0;
for(i = 0; i < n; i++)
if( ++mp[a[i]] >= mp[0] )
maxfreqNum = a[i];
return maxfreqNum;
}
时间: 2024-10-12 23:05:13