描述 这是一篇针对初学者的题解。共用三种方法解决。知识点:数组,排序,哈希难度:一星 题解 题目抽象:给定一个数组,找出数组中的众数,若有,返回众数,若没有,返回0众数定义:数组中出现次数大于数组一般的元素 方法一:哈希法 根据题目意思,显然可以先遍历一遍数组,在map中存每个元素出现的次数,然后再遍历一次数组,找出众数。 代码 class Solution {public:    int MoreThanHalfNum_Solution(vector<int> numbers) {        unordered_map<int,int> mp;        for (const int val : numbers) ++mp[val];        for (const int val : numbers) {            if (mp[val] > numbers.size() / 2 ) return val;        }        return 0;    }};时间复杂度:O(n)空间复杂度:O(n) 方法二:排序法 可以先将数组排序,然后可能的众数肯定在数组中间,然后判断一下。 代码 class Solution {public:    int MoreThanHalfNum_Solution(vector<int> numbers) {        sort(numbers.begin(), numbers.end());        int cond = numbers[numbers.size() / 2];        int cnt = 0;        for (const int k :numbers) {            if (cond == k) ++cnt;        }        if (cnt > numbers.size() / 2) return cond;        return 0;    }};时间复杂度:O(nlongn)空间复杂度:O(1) 方法三:候选法(最优解) 加入数组中存在众数,那么众数一定大于数组的长度的一半。思想就是:如果两个数不相等,就消去这两个数,最坏情况下,每次消去一个众数和一个非众数,那么如果存在众数,最后留下的数肯定是众数。 具体做法: 初始化:候选人cond = -1, 候选人的投票次数cnt = 0 遍历数组,如果cnt=0, 表示没有候选人,则选取当前数为候选人,++cnt 否则,如果cnt > 0, 表示有候选人,如果当前数=cond,则++cnt,否则--cnt 直到数组遍历完毕,最后检查cond是否为众数 代码 class Solution {public:    int MoreThanHalfNum_Solution(vector<int> numbers) {        int cond = -1;        int cnt = 0;        for (int i=0; i<numbers.size(); ++i) {            if (cnt == 0) {                cond = numbers[i];                ++cnt;            }            else {                if (cond == numbers[i]) ++cnt;                else --cnt;            }        }        cnt = 0;        for (const int k :numbers) {            if (cond == k) ++cnt;        }        if (cnt > numbers.size() / 2) return cond;        return 0;    }};时间复杂度:O(n)空间复杂度:O(1)
点赞 179
评论 20
全部评论

相关推荐

华子别追了,我害怕了,每天手机提示音一响我就知道你又来了
徐凤年555:直接屏蔽了就行,真的太离谱了,感觉一万个hr
点赞 评论 收藏
分享
06-25 09:33
厦门大学 Java
球球别拷打俺了:现在日常估计没啥hc了,等到八月多估计就慢慢有了。双九✌🏻不用焦虑的
投递快手等公司10个岗位
点赞 评论 收藏
分享
能干的三文鱼刷了10...:公司可能有弄嵌入式需要会画pcb的需求,而且pcb能快速直观看出一个人某方面的实力。看看是否有面试资格。问你问题也能ai出来,pcb这东西能作假概率不高
点赞 评论 收藏
分享
都送什么礼物吗?如果送的话,价格大概都是多少?辛苦大家给个参考啦!
牛客73617529...:要送就送那种没必要买又很贵的,假设一个打瓦的显示屏 鼠标 键盘都很贵,你送这些突出不了价值,直接送一个很贵的鼠标垫包记住你的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务