题目描述
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
算法思路
摩尔投票法:利用多数元素的数量优势抵消其他元素的影响,最终剩余的元素即为多数元素。
核心思想
- 初始化:维护两个变量
candidate(候选元素)和vote(计数器)。 - 遍历数组:
- 若
vote为0,则将当前元素设为候选。 - 若当前元素等于候选,计数器加1;否则减1。
- 若
- 最终结果:遍历结束后,
candidate即为多数元素。
步骤解析
- 初始化:
candidate设为任意值,vote初始为0。 - 遍历元素:
- 当
vote归零时,重新选定当前元素为候选。 - 根据当前元素与候选是否一致,增减计数器。
- 当
- 返回结果:最终候选元素即为所求。
复杂度分析
- 时间复杂度: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] 为例:
- 初始状态:
candidate=0,vote=0。 - 遍历过程:
- 第1个元素2:
vote=0→candidate=2,vote=1。 - 第2个元素2:
vote=2。 - 第3个元素1:
vote=1。 - 第4个元素1:
vote=0。 - 第5个元素1:
vote=0→candidate=1,vote=1。 - 第6个元素2:
vote=0。 - 第7个元素2:
vote=0→candidate=2,vote=1。
- 第1个元素2:
- 最终结果:
candidate=2。
关键点
- 多数元素存在:题目保证输入数组存在多数元素,因此无需验证结果。
- 抵消机制:非多数元素的“反对票”会被多数元素的“支持票”抵消,最终剩余候选必为多数元素。