Fork me on GitHub

摩尔投票法

有时候,刷算法题的关键是读懂题目。时常卡在读不懂题目=_=

摩尔投票法

今日的力扣每日一题是229.Majority Element II。看懂题目后最开始的想法就是普通的,遍历一遍数组统计出每个数字出现的次数存在数组中,然后再遍历一次数组找出是否存在次数大于⌊ n/3 ⌋的元素。

看了评论区题解学到了新的解题方法。刷题在于学习总结嘛。本题可以用到摩尔投票法的变体。

摩尔投票法出自论文,算法解决的问题是如何在任意多的候选人中,选出获得的票数最多的那个。算法演示文章做了很详细的解读。摩尔投票法主要分为两个阶段,第一阶段筛选可能的元素,第二阶段验证。应用在众数的解答上。

Majority Element II 解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
vector<int> res;
int x = 0, y = 0;
int cx = 0, cy = 0;
for(auto num : nums){
if((cx == 0||num == x)&& num != y){
cx++;
x = num;
}else if(cy == 0|| num == y){
cy++;
y = num;
}else{
cx--;
cy--;
}
}
int countx = 0, county = 0;
for(auto num:nums){
if(num == x) countx++;
if(num == y) county++;
}
int target = nums.size()/3;
if(countx > target) res.push_back(x);
if(county > target && y != x) res.push_back(y);
return res;
}
};

参考博客

169 Majority Element 解答

前提条件中假设数组非空,且一定存在多数元素,所以可以省掉第二阶段验证。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
int majorityElement(vector<int>& nums) {
int res = 0;
int count = 0;
for(auto num: nums){
if(count == 0 || num == res){
res = num;
count++;
}else{
count--;
}
}
return res;
}
};


本文标题:摩尔投票法

文章作者:tsuki

发布时间:2021.10.22 - 10:32

最后更新:2022.04.11 - 21:28

原始链接:https://tsuki419.github.io/摩尔投票法.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------THE END-------------
0%