leetcode 面试经典 150 题(5/150) 169.多数元素

192 阅读2分钟

题目描述

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

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

算法思路

摩尔投票法:利用多数元素的数量优势抵消其他元素的影响,最终剩余的元素即为多数元素。

核心思想

  • 初始化:维护两个变量 candidate(候选元素)和 vote(计数器)。
  • 遍历数组
    • vote 为0,则将当前元素设为候选。
    • 若当前元素等于候选,计数器加1;否则减1。
  • 最终结果:遍历结束后,candidate 即为多数元素。

步骤解析

  1. 初始化candidate 设为任意值,vote 初始为0。
  2. 遍历元素
    • vote 归零时,重新选定当前元素为候选。
    • 根据当前元素与候选是否一致,增减计数器。
  3. 返回结果:最终候选元素即为所求。

复杂度分析

  • 时间复杂度:O(n),仅需一次遍历。
  • 空间复杂度:O(1),仅使用常量空间。

代码实现

func majorityElement(nums []int) int {
    vote, candidate := 0, 0
    for _, num := range nums {
        if vote == 0 {
            candidate = num
        }
        if num == candidate {
            vote++
        } else {
            vote--
        }
    }
    return candidate
}

示例解析

nums = [2,2,1,1,1,2,2] 为例:

  1. 初始状态candidate=0, vote=0
  2. 遍历过程
    • 第1个元素2:vote=0candidate=2, vote=1
    • 第2个元素2:vote=2
    • 第3个元素1:vote=1
    • 第4个元素1:vote=0
    • 第5个元素1:vote=0candidate=1, vote=1
    • 第6个元素2:vote=0
    • 第7个元素2:vote=0candidate=2, vote=1
  3. 最终结果candidate=2

关键点

  • 多数元素存在:题目保证输入数组存在多数元素,因此无需验证结果。
  • 抵消机制:非多数元素的“反对票”会被多数元素的“支持票”抵消,最终剩余候选必为多数元素。