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】的元素可能只有两个。因此,可以考虑使用两个候选的cadidates来进行投票选出最后的结果。
遍历数组,当nums[i]等于备选的任意一个数字时,其对于的times++。否则的话就需要减去times的值,如果减之前time已经为0,则重置新的cadidates。
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
//大于[n/3]的元素可能个数有两个 考虑两个candidates和两个计数
vector<int>res;
if(nums.empty())
return res;
int cad1=INT_MIN,times1=0;
int cad2=INT_MIN,times2=0;
for(int i=0;i<nums.size();i++) //
{
if(nums[i]==cad1)
times1++;
else if(nums[i]==cad2)
times2++;
else
{
if(times1&×2)
{
times1--;
times2--;
}
else if(times1==0)
{
times1=1;
cad1=nums[i];
}
else
{
times2=1;
cad2=nums[i];
}
}
}
times1=times2=0;
for(auto i:nums)
{
if(i==cad1)
times1++;
else if(i==cad2)
times2++;
}
if(times1>(nums.size()/3))
res.push_back(cad1);
if(times2>(nums.size()/3))
res.push_back(cad2);
return res;
}
};
方法二:可以使用hash_map,unordered_map<int,int>slo记录了每一个数组元素nums[i]出现的次数。最后再遍历下slo,对于it->second大于nums.size()/3的情况时候的first,将其添加到最后的结果
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
vector<int>res;
if(nums.empty())
return res;
unordered_map<int,int>slo;
int times=nums.size()/3;
for(int i=0;i<nums.size();i++)
{
if(slo.find(nums[i])!=slo.end())
slo[nums[i]]++;
else
slo[nums[i]]=1;
}
for(unordered_map<int,int>::iterator it=slo.begin();it!=slo.end();it++)
{
if(it->second>times)
res.push_back(it->first);
}
return res;
}
};