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.
因为不超过n/3个数的数最多只有2个,可以定义两个变量,利用类似Majority Element中的思路求解。
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
int n1 = 0, n2 = 0, t1 = 0, t2 = 0;
for(int i = 0; i < nums.size(); i++)
{
if(nums[i] == n1) t1++;
else if(nums[i] == n2) t2++;
else if(t1 == 0)
{
n1 = nums[i];
t1 = 1;
}
else if(t2 == 0)
{
n2 = nums[i];
t2 = 1;
}
else
{
t1--;
t2--;
}
}
t1 = 0; t2 = 0;
for(int i = 0; i < nums.size(); i++)
{
if(nums[i] == n1) t1++;
else if(nums[i] == n2) t2++;
}
vector<int>res;
if(t1 > nums.size()/3) res.push_back(n1);
if(t2 > nums.size()/3) res.push_back(n2);
return res;
}
};