LeetCode原题链接
摩尔投票算法,基于一个事实:每次从序列里选择两个不相同的数字删除掉(或称为“抵消”),最后剩下一个数字或几个相同的数字,就是出现次数大于总数一半的那个。
思路:定义一个计数的变量cnt,当cnt为0时,将ans赋为当前的num;当cnt不为0时,判断当前的num与ans是否相等,相等则cnt的数量加一,否则减一。最后再次遍历数组,统计与当前ans相等的数字的个数,然后判断其总数是否过半。
参考代码:
class Solution {
public:
int majorityElement(vector<int>& nums) {
int cnt=0,ans;
for(auto num : nums){
if(cnt==0) ans=num,cnt=1;
else if(num==ans) cnt++;
else cnt--;
}
cnt=0;
for(auto num : nums) if(num==ans) cnt++;
if(cnt*2>nums.size()) return ans;
else return -1;
}
};