【leetcode】169.多数元素

文章目录


碎碎念

好困...但是项目还有一点东西还在改,等改完传完github跟友友们同步一下就休息,趁ai帮我看问题的时候再写一篇吧。


一、题目

二、思路和题解

1.思路

非常简单粗暴!因为多数元素是说是出现次数大于⌊ n/2 ⌋ 的元素,也就是说,如果数组有5个元素,那么多数元素就至少出现3次;如果数组有10个元素,那么多数元素就至少出现6次。

从这里我们就可以开始发现一些规律了。题目说了保证数组中一定有一个多数元素,那我们如果把所有的多数元素放在一起,它一定会覆盖nums[n/2]。我们可以考虑极端情况,如果多数元素刚好是这个数组中最小的数,那我们把它们都放在一起,也就是都放在最前面,因为多数元素的出现次数大于⌊ n/2 ⌋,所以nums[n/2]一定是多数元素;同样的,如果是最大的,也一样直接去找nums[n/2]。

那下一步就是考虑怎么把它们"放到一起"了,其实很简单刚刚我们已经有提到一点了,就是把它们按从小到大排序,这样相同的数就连着排排坐啦。到这里,我们也可以很快把代码写出来了。

2.代码(排序)

cpp 复制代码
class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int n=nums.size();
        sort(nums.begin(),nums.end());
        return nums[n/2];
    }
};

三、其他解法(哈希映射)

题解里还有个哈希表的解法,其实和我上一篇找【leetcode】136.只出现一次的数那题的方法差不多,都是记录数字出现的次数,然后去找那个出现次数最多的数。

参考题解在这里。

算法:

我们用哈希映射(HashMap)来存储每个元素以及出现的次数。对于哈希映射中的每个键值对,键表示一个元素,值表示该元素出现的次数。

我们用一个循环遍历数组 nums 并将数组中的每个元素加入哈希映射中。在这之后,我们遍历哈希映射中的所有键值对,返回值最大的键。我们同样也可以在遍历数组 nums 时候使用打擂台的方法,维护最大的值,这样省去了最后对哈希映射的遍历。

代码如下:

cpp 复制代码
class Solution {
public:
    int majorityElement(vector<int>& nums) {
        unordered_map<int, int> counts;
        int majority = 0, cnt = 0;
        for (int num: nums) {
            ++counts[num];
            if (counts[num] > cnt) {
                majority = num;
                cnt = counts[num];
            }
        }
        return majority;
    }
};

四、错误回顾

这次也是很丝滑秒了,值得鼓励!!晚安啦~

相关推荐
漂流瓶jz36 分钟前
UVA-1613 K度图的着色 题解答案代码 算法竞赛入门经典第二版
算法·深度优先·图论·贪心·aoapc·算法竞赛入门经典·uva
文丑颜不良啊1 小时前
LeetCode2921~2940题目解析
java·leetcode
Pniubi1 小时前
动态规划入门 ( - 力扣509斐波那契数)
算法·动态规划
吴长建先生重名了2 小时前
GitHub Actions部署报表系统踩坑记:幂等性与限
算法
贝壳6903 小时前
一个2026年2月才上传的库,凭什么敢碰2009年就有人写烂的题目
算法
文丑颜不良啊3 小时前
LeetCode2901~2920题目解析
java·leetcode
贝壳6903 小时前
同一道三亿位选型题,三个AI给了我三个答案,我把它们拉进同一台机器复跑
算法
Yuzhiyuxia4 小时前
【AI Agent面试系列】AI Agent实战设计
人工智能·面试·职场和发展
文丑颜不良啊5 小时前
LeetCode2861~2880题目解析
java·leetcode
青少儿编程课堂6 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛