【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;
    }
};

四、错误回顾

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

相关推荐
皓月斯语19 小时前
P5736 【深基7.例2】质数筛
c++·算法·题解
极序时代GEO品牌优化20 小时前
杭州极序时代|面向地域、设备与用户画像的动态GEO
人工智能·python·算法·极序时代geo
啦啦啦啦啦zzzz21 小时前
贪心算法和动态规划
c++·算法·贪心算法·动态规划
happyprince21 小时前
篇3:bitsandbytes-深刻观-哲学与升华
人工智能·算法
应用市场21 小时前
红绿灯背后的算法:从 Webster 配时到 Max-Pressure 与强化学习
算法
木井巳21 小时前
【DFS解决floodfill算法】岛屿的最大面积
java·算法·leetcode·深度优先
yyds_yyd_1008621 小时前
877. 石子游戏(2026.08.02)& 486. 预测赢家(2026.08.01)
c++·leetcode
m沐沐21 小时前
【机器学习】朴素贝叶斯算法:从贝叶斯定理到手写数字识别实战
人工智能·深度学习·算法·机器学习·计算机视觉·手写数字·数字识别
June`1 天前
常量内存和只读缓存
c++·人工智能·算法·cuda
一条大祥脚1 天前
ABC468 扫描线|贡献法|二阶差分|线段树优化DP
数据结构·算法