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

四、错误回顾

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

相关推荐
啥咕啦呛8 分钟前
跟着AI学Java第2天:Java基础语法巩固
java·python·算法
csuzhucong38 分钟前
螺旋归纳DP
算法
qeen8743 分钟前
【算法笔记】模拟与高精度加减乘除
c++·笔记·算法·高精度·模拟
鱼很腾apoc1 小时前
【学习篇】第17期 C++入门必看——类和对象全站最详篇
c语言·开发语言·学习·算法·青少年编程
zzzsde1 小时前
【Linux】进程信号(1)理解信号及信号产生的方式
linux·运维·服务器·算法
啊哦呃咦唔鱼2 小时前
LeetCode双指针合集
算法·leetcode·职场和发展
WolfGang0073212 小时前
代码随想录算法训练营 Day37 | 动态规划 part10
算法·动态规划
baizhigangqw2 小时前
启发式算法WebApp实验室:从搜索策略到群体智能的能力进阶(二)
算法·启发式算法·web app
alphaTao2 小时前
LeetCode 每日一题 2026/4/13-2026/4/19
算法·leetcode·职场和发展
灵智实验室2 小时前
PX4姿态解算技术详解(四):姿态更新/递推与共锥补偿
算法·无人机·px 4