给定一个大小为 n 的数组,找到数组众数。

痴心易碎 提交于 2020-02-02 05:01:24

方法一:
哈希表法通过管理一个哈希表来记录数组每一个元素出现的次数,然后遍历哈希表即可求出众数。

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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!