题目
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times.
Note: The algorithm should run in linear time and in O(1) space.
示例
Input: [1,1,1,3,3,2,2,2]
Output: [1,2]
解析
题目限定了时间复杂度O(n)和空间复杂度O(1),所以只能采用 Moore Voting算法。
另外,解题之前,我们需要知道一个事实,任意一个数组出现次数大于n/3的元素最多只有两个,利用这个原理,我们就可以对Moore Voting算法进行扩充,设置两个candidate和两个candidate取得的票数来实现算法。
算法
vector<int> majorityElement(vector<int>& nums) {
vector<int> ret;
int m = 0;
int n = 0;
int cm = 0; //counter for m;
int cn = 0; //counter for n;
for(auto num: nums){
if(num==m) cm++;
else if(num==n) cn++;
else if(cm==0){
m = num;
cm = 1;
}
else if(cn==0){
n = num;
cn = 1;
}
else{
cm--;
cn--;
}
}
cm = 0;
cn = 0;
//calculate m or n get how many votes
for(auto num: nums){
if(num==m) cm++;
else if(num==n) cn++;
}
//check m or n are valid candidates
if(cm>nums.size()/3) ret.push_back(m);
if(cn>nums.size()/3) ret.push_back(n);
return ret;
}