169.多数元素
169.多数元素
给定一个大小为 n
的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋
的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
1 | 输入:[3,2,3] |
在数组中占比已经超过一半的数字
Solution:排序查找
1 | class Solution { |
因为元素在数组中的出现次数大于了n/2
,所以下标为n/2
的元素一定是多数元素
Solution1:Boyer-Moore 投票算法
Boyer-Moore 算法,我们首先给出 Boyer-Moore 算法的详细步骤:
- 我们维护一个候选众数
candidate
和它出现的次数count
。初始时candidate
可以为任意值,count
为0
; 我们遍历数组
nums
中的所有元素,对于每个元素x
,在判断x
之前,如果count
的值为0
,我们先将x
的值赋予candidate
,随后我们判断x
:- 如果
x
与candidate
相等,那么计数器count
的值增加1
; - 如果
x
与candidate
不等,那么计数器count
的值减少1
。
- 如果
在遍历完成后,
candidate
即为整个数组的众数。
1 | class Solution { |
投票算法证明:
- 如果候选人不是
major
则major
会和其他非候选人一起反对候选人,所以候选人一定会下台(coumt==0
时发生换届选举) - 如果候选人是
major
, 则major
会支持自己,其他候选人会反对,同样因为major
票数超过一半,所以major
一定会成功当选