第12天 多数元素

题意: 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。

题目链接:https://leetcode.cn/problems/majority-element/

官方题解:https://leetcode.cn/problems/majority-element/solutions/146074/duo-shu-yuan-su-by-leetcode-solution/

一、看到题目的第一想法

这道题的核心是找到数组中出现次数超过一半的元素,也就是「多数元素」。

  1. 最直接的思路:既然要统计出现次数,那用一个哈希表(unordered_map)来记录每个数字出现的次数,再遍历一次哈希表找到次数大于 n/2 的元素即可。
  2. 题目隐含的条件:多数元素一定存在,且只有一个,所以不用处理找不到的情况。
  3. 优化直觉:边统计边记录当前的 "候选多数元素" 和它的次数,不用等统计完再遍历哈希表,一次循环就能解决。

二、实现过程中遇到的困难

  1. 哈希表的使用细节 一开始可能会忘记 unordered_map 中不存在的键,直接访问时会默认初始化为 0,所以 ++counts[num] 是安全的,但如果没理解这一点,可能会额外写很多判断逻辑。
  2. 边统计边更新的逻辑误区一开始可能会想 "先把所有次数统计完,再遍历哈希表找最大值",但这样需要两次循环,而题目中的写法是一次循环内完成统计和更新,更高效。难点在于理解:只要当前元素的计数超过了当前记录的最大计数,就更新候选元素,最终的候选元素一定是多数元素。
  3. 时间与空间复杂度的取舍 哈希表解法的空间复杂度是 O(n),而题目有更优的「摩尔投票法」可以做到 O(1) 空间。一开始只想到了哈希表,忽略了更优解法,也是一个常见的思维局限。
  4. 边界条件处理比如数组长度为 1 时,直接返回唯一元素即可,不过哈希表的写法天然能处理这种情况,不会出错。

三、今日收获心得

  1. 哈希表是统计频次的通用工具 对于 "统计元素出现次数" 的问题,哈希表是最直接的解法,它能以 O(1) 的平均时间复杂度完成增删改查,非常适合这类统计问题。
  2. 一次遍历的优化思路 题目中的写法把「统计次数」和「更新候选多数元素」合并到了一次循环里,避免了二次遍历,时间复杂度保持 O(n),但常数更小,这种边遍历边更新状态的思想很实用。
  3. 理解 "多数元素" 的特殊性质多数元素的出现次数超过一半,所以它的计数在整个数组中一定是最高的,这也是为什么边统计边更新候选元素的方法一定能找到正确答案。
  4. 算法题的解法对比思维 除了哈希表解法,这道题还有更优的「摩尔投票法」,空间复杂度 O(1)。通过这道题可以体会到:同一道题,不同的解法在空间、时间复杂度上的差异,以及如何利用题目条件(比如多数元素一定存在)来优化算法。
相关推荐
Gigavision40 分钟前
DEAP数据集 2026最新Transformer算法 DEAP 数据集 下载
深度学习·算法·transformer
夜之眷属1 小时前
PriorityQueue:for-each 遍历和 poll 取出,顺序一样吗?
java·服务器·数据结构·后端·算法
地平线开发者2 小时前
不是线程越多越快:用 hrt_model_exec 在 征程6M 上给 YOLOv5x 建立性能基线
算法
霍霍的袁2 小时前
【C++】哈希表实现指南:从原理到开放定址法、链地址法的实现
c++·学习·哈希算法·散列表·visual studio
姜鱼问生2 小时前
fail2ban 实战:从默认配置到生产可用
后端·算法·架构
垆边人似月.2 小时前
华为题:全排列
算法·深度优先·图论
杜 硕3 小时前
快速排序详解01
数据结构·算法·排序算法
Matlab程序猿3 小时前
【MATLAB源码-第459期】基于matlab的D-H模型与阻尼最小二乘逆运动学的六自由度机械臂五次轨迹规划及动力学前馈PD控制仿真。
人工智能·算法·matlab·d-h建模·六自由度串联机械臂
信奥卷王3 小时前
[GESP202606 六级] 满二叉树
数据结构·算法
积流成海3 小时前
用代码实现哈希计算器:Web Crypto API 实战
前端·算法·哈希算法·哈希函数·盘子工具站