Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋
times.
Note: The algorithm should run in linear time and in O(1) space.
Example 1:
Input: [3,2,3] Output: [3]
Example 2:
Input: [1,1,1,3,3,2,2,2] Output: [1,2]
class Solution {
public:
int val(vector<int> nums, int tar)
{
int ans = 0;
for(auto item:nums)
{
if(item==tar)
ans++;
}
return ans;
}
vector<int> majorityElement(vector<int>& nums)
{
if(nums.size()<2)
return nums;
int k = 3;
vector<int> ans;
unordered_map<int, int> table;
for(int i = 0;i<nums.size();i++)
{
if(table.find(nums[i])!=table.end())
table[nums[i]]++;
else
{
if(table.size()<k-1)
table[nums[i]]++;
else
{
auto it=table.begin();
while(it!=table.end())
{
it->second--;
if(it->second==0)
it = table.erase(it);
else
it++;
}
}
}
}
for(auto it = table.begin();it!=table.end();it++)
if(val(nums, it->first) > (nums.size()/k))
ans.push_back(it->first);
return ans;
}
};