思路:摩尔投票法,类似与消消乐,拿最多次数的两个数和其他数做抵消,最后留下的肯定是次数多的数。
摩尔投票法可以推广到「统计出现次数超过 n / k的所有数」。
代码如下
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
int num1=0,num2=0,cnt1=0,cnt2=0;
for(auto&num:nums){
if(cnt1>0&&num1==num){
//如果是第一候选人,第一候选人的数量+1
cnt1++;
}
else if(cnt2>0&&num2==num){
//如果是第二候选人,第二候选人的数量+1
cnt2++;
}
else if(cnt1==0){
//如果第一候选人的数量为0,当上第一候选人
num1 = num;
cnt1++;
}
else if(cnt2==0){
//如果第二候选人的数量为0,当上第二候选人
num2 = num;
cnt2++;
}
else {
//其他数做抵消
cnt1--;
cnt2--;
}
}
int newcnt1 = 0;
int newcnt2 = 0;
//计算实际候选人的数量
for(auto&num:nums){
if(cnt1>0&&num==num1){
newcnt1++;
}
if(cnt2>0&&num==num2){
newcnt2++;
}
}
vector<int>ans;
//满足要求返回结果
if(cnt1>0&&newcnt1>nums.size()/3){
ans.push_back(num1);
}
if(cnt2>0&&newcnt2>nums.size()/3){
ans.push_back(num2);
}
return ans;
}
};