给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。
进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1)的算法解决此问题。
输入:[1,1,1,3,3,2,2,2]
输出:[1,2]
输入:[3,2,3]
输出:3
哈希表求解
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
vector<int> ret;
unordered_map<int,int> counts;
int value = 0;
//<键,值> == <nums[i],值>
for(int num : nums){
++counts[num];
}
for(auto x:counts){
if(x.second > nums.size()/3){
ret.push_back(x.first);
}
}
sort(ret.begin(),ret.end());
return ret;
}
};
摩尔投票法
(1)设置两个候选人,用第三个人与前两个人投票
(2)统计后得到can1 can2 计算can1 can2在原nums出现的次数
(3)判断can1 can2是否满足原题意
class Solution {
public:
vector<int> majorityElement(vector<int> &nums) {
int m = 0,cm = 0;
int n = 0,cn = 0;
for(auto num : nums){
if(m == num){
cm++;
} else if(n == num){
cn++;
} else if(cm == 0){
m = num;
cm = 1;
}else if(cn == 0){
n = num;
cn = 1;
} else{
cm--;
cn--;
}
}
cm = 0;
cn = 0;
for(auto num : nums){
if(num == m){
cm++;
} else if(num == n){
cn++;
}
}
vector<int> res;
if(cm > nums.size() / 3){
res.push_back(m);
}
if(cn > nums.size() / 3){
res.push_back(n);
}
return res;
}
};