摩尔投票法简单来说就是在不影响或者增大众数在整个数组中的地位的情况下去消除无关数字带来的影响,只需遍历一遍数组即可找到众数。 算法流程:
先随机假设一个数x为候选数(可以假设数组的第一个数),并尝试维护一个count计数器(开始设置为0.设置了众数后置1)。 接着对数组进行循环, 1、如果说循环到的数和候选数相同, 那么就count+1。 2、如果说和x不一样,则count-1。 3、当count回归到0时,对于众数的选择则重新开始(重新选择目前循环到的数为众数)。
比如说现在有【1 2 1 1 2】 一共5个数,当循环 【1 2】结束,count会重置为0。 试考虑如下几种情况: 1、如果1和2包含了众数,那么众数少了一个和非众数少了一个,并不会影响众数在整个数组中的地位。所以可以重新开始选择。 2、如果都不包含众数,那么众数的地位只会更加上升,到最后统计出来一定会是一个更大的正数count值。 PS:1和2不可能同时为众数。
class Solution {
public:
int majorityElement(vector<int>& nums) {
// 常规map统计法
// map<int ,int > mp;
// int MaxNum = 0;
// for(int i = 0; i < nums.size();i++){
// mp[nums[i]]++;
// if(mp[nums[i]]>nums.size()/2){
// MaxNum = nums[i];
// }
// }
//摩尔投票法
int cand = nums[0];//候选数
int ans = 0;
int count = 1;//计数
for(int i = 1;i< nums.size();i++){
if(count == 0){
cand = nums[i];
}
if(nums[i]==cand)
count++;
else{
count--;
}
}
return cand;
}
};