#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
/*
Given an array of integers and a number K, the majority number is the number
that occurs more than 1/k if the size of the array.
Note: there is only one majoirty number in the array.
*/
/*
if we use counting method, it will take too much memory.
Since we only need to get the only one majority number. we can use a size K hashmap
to remember the current majority.
*/
int majorityNumber(vector<int>& nums, int k) {
unordered_map<int, int> numToCount;
int n = nums.size();
for(const auto& i : nums) {
++numToCount[i];
if(numToCount.size() == k) {
auto iter = numToCount.begin();
while(iter != numToCount.end()) {
if(--(iter->second) == 0) {
numToCount.erase(iter++);
} else ++iter;
}
}
}
for(auto& it : numToCount) {
it.second = 0;
}
vector<int> res;
for(const auto& i : nums) {
auto it = numToCount.find(i);
if(it.second > static_cast<double>(n) / k) {
res.push_back(it.first);
}
}
return res[0];
}
Majority Element III
最新推荐文章于 2018-07-09 00:11:39 发布