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.
Hint:
- How many majority elements could it possibly have?Show More Hint
思路1:
题目中重点强调出现的次数大于⌊ n/3 ⌋,所以可能有0个、1个或者2个(最多2个)这样的数存在,所以只需要设置2个变量cand1,、cand2来记录出现次数可能大于⌊ n/3 ⌋的数据,分别用count1和count2记录数据出现的次数。
思路2:
另一种最直接的方法就是用map对数组中每个值出现的次数做记录,然后把出现次数大于⌊ n/3 ⌋的值存入返回结果,该方法的缺点是空间复杂度为O(n)。
代码1实现:
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
vector<int> result;
if(nums.size() < 1) return result;
if(nums.size() == 1) return nums;
int cand1 = 0, cand2 = 0;
int count1 = 0, count2 = 0;
//找到满足条件的数,可能有一个满足条件的,最多有两个满足条件的
for(auto num: nums)
{
if (count1 == 0)
cand1 = num;
else if (count2 == 0)
cand2 = num;
//处理count的值
if(cand1 == num)
++count1;
else if(cand2 == num)
++count2;
else
{
--count1;
--count2;
}
}
if(count(nums.begin(), nums.end(), cand1) > nums.size() / 3)
result.push_back(cand1);
//此处cand1 != cand2一定要判断,否则对于数组[2,2],就会返回[2,2],而期望的结果是[2]
if(cand1 != cand2 && count(nums.begin(), nums.end(), cand2) > nums.size() / 3)
result.push_back(cand2);
return result;
}
};
代码实现2:
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
map<int, int> myMap;
for (auto& num: nums)
myMap[num]++;
vector<int> res;
for (auto it = myMap.begin(); it != myMap.end(); it++)
if (it->second > nums.size()/3)
res.push_back((*it).first);
return res;
}
};