【每天学习一点算法 2026/04/17】多数元素

每天学习一点算法 2026/04/17

题目:多数元素

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

最容易想到的方法就是利用 Map 统计各个元素出现的次数,某一个元素超过 n/2 就返回这个元素。

typescript 复制代码
function majorityElement(nums: number[]): number {
  const map: Map<number, number> = new Map()
  for (let i = 0; i < nums.length; i++) {
    const item = nums[i]
    if (map.has(item)) {
      const count = map.get(item)
      map.set(item, count + 1)
      if (count + 1 > nums.length / 2) {
        return item
      }
    } else {
      map.set(item, 1)
      if (nums.length === 1) {
        return item
      }
    }
  }
};

我们还可以对数组进行排序那么位于中间的元素一定是众数

typescript 复制代码
function majorityElement(nums: number[]): number {
  return nums.sort()[Math.floor(nums.length / 2)]
};

**进阶:**尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。

Boyer-Moore 投票算法

我们遍历数组元素进行两两对比,遇到不同的元素就消耗掉它们,到最后剩下的一定就是众数,因为最差的情况也只能消耗 n / 2 个众。具体实现方法需要维护两个变量,一个是当前候选的众数以及它出现的次数,当次数归零就需要更换候选众数。

typescript 复制代码
function majorityElement(nums: number[]): number {
  let res = nums[0], count = 1 // 初始化候选众数和它出现的次数
  // 遍历消耗元素
  for (let i = 1; i < nums.length; i++) {
    if (nums[i] === res) {
      // 遇到相同元素 数量 + 1
      count++
    } else {
      // 遇到不同元素 数量 - 1
      count--
      if (count === 0) {
        // 如果数量归 0 更换候选众数为下一个元素
        res = nums[i + 1]
      }
    }
    
  }
  return res
};

题目来源:力扣(LeetCode)

相关推荐
星夜离尘561 小时前
MATLAB 离散数据分箱:半开区间、末端点与计数、加权和、平均
算法·matlab
Pniubi1 小时前
力扣76.最小覆盖子串
算法·leetcode·职场和发展
地平线开发者1 小时前
征程6|用 hrt\_model\_exec 看清 YOLOv5x 的输入、原始输出和后处理
人工智能·算法
csdn_aspnet2 小时前
C++ 3个有序点的方向(Orientation of 3 ordered points)
c++·算法
赤生云电竞3 小时前
GPU算力共享平台架构实践:任务分发与资源隔离的关键配置
算法·架构·gpu算力
li星野3 小时前
相位补偿学习记录:把被颅骨“打乱“的声波重新对齐
学习
Z21-X4 小时前
云原生运维学习笔记:ECShop全链路容器化部署与Docker底层资源隔离深度剖析
运维·笔记·学习·云原生
青少儿编程课堂4 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:折半搜索优化子集枚举(Meet in the Middle)解析
c++·python·算法·bfs·信息学竞赛
red_redemption4 小时前
自由学习记录(230)
学习
wo_jack5 小时前
C++ 入门笔记(十七):list 入门 —— 为什么 list 不能 sort?
数据结构·c++·面试·stl·list