方法一:
哈希表法通过管理一个哈希表来记录数组每一个元素出现的次数,然后遍历哈希表即可求出众数。
int majorityElement(vector<int>& nums)
{
map<int, int> m_mapNums;
for (int i = 0; i < nums.size(); i++)
{
if (m_mapNums.count(nums[i]))
{
m_mapNums[nums[i]]++;
}
else
{
m_mapNums.insert(pair<int, int>(nums[i],1));
}
}
int m_iOutPos = 0;
int m_iOut = 0;
for (map<int, int>::iterator iter= m_mapNums.begin(); iter != m_mapNums.end(); iter++)
{
if (m_iOutPos < iter->second)
{
m_iOutPos = iter->second;
m_iOut = iter->first;
}
}
return m_iOut;
}
方法二:
Boyer-Moore 投票算法,此方法是从官方题解中获得,其方法简单易懂且超过任一算法时间和空间复杂度,因此在此列出。
方法:维护一个记录器(记录当前数组段众数)和计数器(记录当前数组段众数与非众数差值),当计数器等于0时,记录器记录数组下一个数字,记做下一数组段的众数,遍历数组一遍即可得出整个数组众数。
示例:
数组 a=[1,2,3,4,5,6,7,4,3,3,3,2,1],求数组a的众数;
定义一个记录器num和计数器count,初始化num=a[0],即: num=1, count=1
则第一个数组段为[1,2],此时,count=0;
以此方法数组a被分为如下几段:
a=[1,2 | 3,4 | 5,6 | 7,4 | 3,3,3,2,1] num=3,count=1
每一个 “|” 处,计数器count都为0;
int majorityElement(vector<int>& nums)
{
int m_iOutputNum = nums[0];
int m_iOutputCounts = 1;
for (int i = 1; i < nums.size(); i++)
{
if (m_iOutputCounts > 0)
{
if (m_iOutputNum == nums[i])
{
m_iOutputCounts++;
}
else
{
m_iOutputCounts--;
}
}
else
{
m_iOutputNum = nums[i];
m_iOutputCounts++;
}
}
return m_iOutputNum;
}