题目:
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.
解答:
典型的摩尔投票的方法直接在代码中进行注释讲解
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
int cnt1 = 0;
int cnt2 = 0;
int tmp1 = 0; //主元素最多只可能有两个
int tmp2 = 0;
vector<int> res;
int size = nums.size();
if(size == 0)
return res;
for(int i = 0; i < size; ++i)
{
if(nums[i] == tmp1)//选择这个if else的顺序的原因是当如果把判断cnt == 0放在最前面 可能会出现tmp1和tmp2相等的情况
cnt1++;
else if(nums[i] == tmp2)
cnt2++;
else if(cnt1 == 0)
{
tmp1 = nums[i];
cnt1++;
}
else if(cnt2 == 0)
{
tmp2 = nums[i];
cnt2++;
}
else
{
cnt1--;
cnt2--;
}
}
cnt1 = 0;
cnt2 = 0;
for(int i = 0; i < size; ++i)
{
if(nums[i] == tmp1)
cnt1++;
if(nums[i] == tmp2)
cnt2++;
}
if(tmp1 == tmp2)
{
res.push_back(tmp1);
return res;
}
if(cnt1 > size / 3)
res.push_back(tmp1);
if(cnt2 > size / 3)
res.push_back(tmp2);
return res;
}
};