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.
class Solution { public: //O(n) Space compexity vector<int> majorityElement01(vector<int>& nums) { vector<int> result; unordered_map<int, int> counts; int n = nums.size(); for(auto item : nums){ counts[item]++; if (counts[item] > n/ ){ result.push_back(item); counts[item] = -n; // Tricky: make sure the item only can be put into result once. } } return result; } //We know, there could be at most two numbers can be more than 1/3 //so, same as Majority Element I problem, we can have two counters. vector<int> majorityElement02(vector<int>& nums) { if(nums.size()<=) return nums; //the same algorithm as Majority Element I problem int majority1=, majority2=, cnt1=, cnt2=; for(auto item: nums) { if (cnt1 == && majority2 != item ) { majority1 = item; cnt1 = ; } else if (majority1 == item) { cnt1++; } else if (cnt2 == ) { majority2 = item; cnt2 = ; } else if (majority2 == item) { cnt2++; } else { cnt1--; cnt2--; } } //re-check it again, in case there has less than two numbers of majority cnt1 = cnt2 = ; for (auto item : nums) { if (majority1 == item) cnt1++; else if (majority2 == item) cnt2++; } vector<int> result; if (cnt1 > nums.size()/) result.push_back(majority1); if (cnt2 > nums.size()/) result.push_back(majority2); return result; }