算法的核心思想是 “对抗”,即:
- 通过投票的方式,让不同的元素相互抵消(对抗)。
- 在遍历数组的过程中,始终保留一个候选 major,如果遇到相同元素就增加计数,遇到不同元素就减少计数。
- 最终剩下的 major 就是众数。
major = nums[0] # 先假设第一个元素是众数
count = 0 # 计数器初始化为 0
for each in nums: # 遍历整个数组
if count == 0: # 如果计数为 0,更新候选众数
major = each # 重新选择当前元素作为候选
if each == major: # 如果当前元素等于候选众数
count += 1 # 计数增加
else: # 如果当前元素不同
count -= 1 # 计数减少
对抗阶段的理解:
- 计数 count 代表当前候选 major 的“支持度”,如果 count == 0,说明之前的候选已经被“对抗”掉了,需要重新选择新的候选。
- 如果当前元素和 major 相同,说明这个元素在“支持” major,于是 count +1。
- 如果当前元素和 major 不同,说明它在“反对” major,于是 count -1。
- 如果 count 归零,说明 major 遭到了足够多的“反对”,于是换一个新的候选。
|