线性时间多数投票算法
论文链接: www.cs.utexas.edu/~moore/best…
问题描述
给定一个数组,其中有一个元素出现的次数超过了数组长度的一半,找出这个元素——多数元素。
注意:
- 假设数组长度为n, 那么长度的一半为
n/2向下取整 - 假设数组中始终存在多数元素
算法描述
- 初始化候选元素
candidate为None, 候选元素出现的次数count为0 - 遍历数组中的每个元素
x- 如果
count为0, 则将x赋值给candidate, 并将count置为1 - 如果
x等于candidate, 则count加1, 否则count减1
- 如果
- 返回
candidate
图示
维护一个candidate:count的结构, 遍历数组.
初始化candidate为None, count为0
前进一步,
candidate为A, count为1
前进一步, candidate为A, count为2
前进一步, candidate为A, count为3
前进一步, 遇到C, candidate为A, count减一为2
前进一步, candidate为C, count减一为1
前进一步, count减一为0, 所以candidate变为None
candidate为B, count为1
candidate为None, count为0
candidate为C, count为1
candidate为C, count为2
candidate为C, count为1
candidate为C, count为2
最后返回C
代码
C++
class Solution {
public:
int majorityElement(vector<int>& nums) {
int candidate = nums[0];
int count = 1;
for (int i = 1; i < nums.size(); i++) {
if (count == 0) {
candidate = nums[i];
count++;
} else if (nums[i] == candidate) {
count++;
} else {
count--;
}
}
return candidate;
}
};
Go
func majorityElement(nums []int) int {
major := nums[0]
count := 1
for _, num := range nums[1:] {
if num == major {
count++
} else if count == 0 {
major = num
count++
} else {
count--
}
}
return major
}