169. 多数元素
class Solution {
public:
int majorityElement(vector<int>& nums) {
// Boyer-Moore投票算法
int size = nums.size();
int candidate = 0; // 候选数字
int count = 0;// 候选数字的出现次数
for(int i = 0; i < size; i++){
if(count == 0){ // 如果出现次数0
candidate = nums[i];//抵消完了不同的数字,更新
}
if(candidate == nums[i]){// 当前值是候选数字
count++;
}else{//当前值不是候选数字
count--;
}
}
return candidate;
}
};
229. 求众数 II
169题
改一改
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
// 1、如果投A(当前元素等于A),则A的票数++;
// 2、如果投B(当前元素等于B),B的票数++;
// 3、如果A,B都不投(即当前与A,B都不相等),那么检查此时A或B的票数是否减为0,如果为0,则当前元素成为新的候选人;如果A,B两个人的票数都不为0,那么A,B两个候选人的票数均减一。
// 最后会有这么几种可能:有2个大于n/3,有1个大于n/3,有0个大于n/3
// 遍历结束后选出了两个候选人,但是这两个候选人是否满足>n/3,还需要再遍历一遍数组,找出两个候选人的具体票数,因为题目没有像169题保证一定有。
vector<int> res;
int size = nums.size();
int candidateA = 0;
int candidateB = 0;
int countA = 0;
int countB = 0;
for(int i = 0; i < size; i++){
if(nums[i] == candidateA){
countA++;
}else if(nums[i] == candidateB){
countB++;
}else{// AB都不相等
if(countA == 0){
candidateA = nums[i];
countA++; // 注意
}else if(countB == 0){
candidateB = nums[i];
countB++; // 注意
}else{
countA--;
countB--;
}
}
}
cout<<candidateA<<" "<<candidateB<<endl;
// 两个候选人
countA = countB = 0;
for(int i = 0; i < size; i++){
if(nums[i] == candidateA){
countA++;
}else if(nums[i] == candidateB){
countB++;
}
}
cout<<countA<<" "<<countB<<endl;
if(countA > size / 3){
res.push_back(candidateA);
}
if(countB > size / 3){
res.push_back(candidateB);
}
return res;
}
};