题目要求:给出一个长度为n的数组,找出数组中所有出现次数大于n/3的元素。要求时间复杂度为O(n),空间复杂度为O(1)。
问题解答:
1.时间复杂度为O(n),空间复杂度为O(n)。用STL中的map,将数组中各个元素出现的个数存起来。代码很简单,但是空间复杂度不满足要求。
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
map<int,int> m;
vector<int> result;
for(int i=0;i<nums.size();i++){
map<int,int>::iterator ite=m.find(nums[i]);
if(ite!=m.end())
ite->second++;
else{
m[nums[i]]=1;
}
}
map<int,int>::iterator index=m.begin();
while(index!=m.end()){
if(index->second>nums.size()/3)
result.push_back(index->first);
index++;
}
return result;
}
};
2.时间复杂度为O(n),空间复杂度为O(1)的解法。用了Moore‘s Voting 算法。
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
int a=0,b=0,ta=0,tb=0;
vector<int> result;
for(int i=0;i<nums.size();i++){
if(a==nums[i])
ta++;
else if(b==nums[i])
tb++;
else if(ta==0){
a=nums[i];
ta=1;
}
else if(tb==0){
b=nums[i];
tb=1;
}
else{
ta--;
tb--;
}
}
ta=0;
tb=0;
for(int i=0;i<nums.size();i++){
if(nums[i]==a)
ta++;
else if(nums[i]==b)
tb++;
}
if(ta>nums.size()/3) result.push_back(a);
if(tb>nums.size()/3) result.push_back(b);
return result;
}
};