方法一:
哈希表法通过管理一个哈希表来记录数组每一个元素出现的次数,然后遍历哈希表即可求出众数。
int majorityElement(vector<int>& nums)
{map<int, int> m_mapNums;for (int i = 0; i < nums.size(); i++){if (unt(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 != d(); 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;
}
本文发布于:2024-02-01 19:21:51,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170678651038895.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |