LC 169数组与双指针简单第 5 / 95 题

多数元素

Majority Element

Boyer-Moore 投票计数
本机进度仅保存在当前浏览器

题目描述

给定一个大小为 n 的数组,其中多数元素指出现次数大于 n/2 的元素。你可以假设数组非空且多数元素一定存在,请找出它。进阶:尝试空间复杂度 O(1)、时间复杂度 O(n) 的解法。

示例:nums = [2, 2, 1, 1, 1, 2, 2],输出 2。

解题思路

  1. 哈希计数是平凡解法,但要 O(n) 空间;题目保证多数元素过半,可用 Boyer-Moore 投票法做到 O(1) 空间。
  2. 维护候选数 candidate 与票数 count:遇到相同元素票数加一,不同则减一,减到零就换当前元素当候选。
  3. 正确性直观理解:多数元素与其他所有元素"捉对抵消"后仍有剩余,因此最终候选一定是它。

参考实现

查看参考实现Python · 建议先自行作答
def majorityElement(nums):
    # Boyer-Moore 投票:不同元素互相抵消,多数元素必有剩余
    candidate, count = 0, 0
    for x in nums:
        if count == 0:
            candidate = x
        count += 1 if x == candidate else -1
    return candidate

复杂度与归属

时间复杂度O(n)
空间复杂度O(1)
所属分类数组与双指针
题源LeetCode 169

关联教程

返回题图鉴