描述 这是一篇针对初学者的题解。共用三种方法解决。知识点:数组,排序,哈希难度:一星 题解 题目抽象:给定一个数组,找出数组中的众数,若有,返回众数,若没有,返回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)
点赞 180
评论 20
全部评论

相关推荐

半解316:内容充实,细节需要修改一下。 1,整体压缩为一页。所有内容顶格。 2,项目描述删除,直接写个人工作量 修改完之后还需要建议,可以私聊
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
今天 10:15
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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