Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋
times. The algorithm should run in linear time and in O(1) space.
1.用map
//1.hash
vector<int> majorityElement(vector<int>& nums) {
map<int, int>mp;
vector<int>res;
int len = nums.size();
for(int i = 0; i < nums.size(); i++){
if(mp.find(nums[i]) == mp.end())
mp[nums[i]] = 1;
else
mp[nums[i]]++;
}
map<int, int>::iterator it;
for(it = mp.begin(); it != mp.end(); it++){
if(it->second > (len/3))
res.push_back(it -> first);
}
return res;
}
2.用经典方法 moore's voting algorithm
//2.moore's voting algorithm
//由于找出现次数超过n/3的元素,故结果可能有1~2个,因此候选集存两个元素及其次数
vector<int> majorityElement(vector<int>& nums) {
int a = 0, b = 0, cnta = 0, cntb = 0;
int n = nums.size();
vector<int>res;
for(int i = 0; i < nums.size(); i++){
if(a == nums[i])
cnta++;
else if(b == nums[i])
cntb++;
else if(cnta == 0){
a = nums[i];
cnta = 1;
}else if(cntb == 0){
b = nums[i];
cntb = 1;
}else{
cnta--;
cntb--;
}
}
cnta = 0, cntb = 0;
for(int j = 0; j < nums.size(); j++){
if(nums[j] == a) cnta++;
else if(nums[j] == b) cntb++;
}
if(cnta > (n/3)) res.push_back(a);
if(cntb > (n/3)) res.push_back(b);
return res;
}