Given an array of size n, find the majority element. The majority element is the element that appears more than⌊ n/2 ⌋
times.
You may assume that the array is non-empty and the majority element always exist in the array.
class Solution {
public:
/*algorithm1: sort and count the same elememnt
time: O(nlogn) space O(1)
*/
int majorityElement(vector<int>& nums) {
if(nums.size() < 1)return 0;
int majCnt = 1,cnt = 1;
int maj = nums[0];
sort(nums.begin(),nums.end());
for(int i = 1;i < nums.size();i++){
if(nums[i]==nums[i-1]){
cnt++;
}
if(nums[i] != nums[i-1] || (i+1)==nums.size()){
if(cnt > majCnt){
majCnt = cnt;
maj = nums[i-1];
}
cnt = 1;
}
}
if(majCnt > nums.size()/2)return maj;
return 0;
}
};
class Solution {
public:
/*algorithm2: count based on hash table
time: O(n) space O(n)
*/
int majorityElement(vector<int>& nums) {
unordered_map<int,int>hash;
for(int i = 0;i < nums.size();i++)hash[nums[i]]++;
for(auto it = hash.begin();it != hash.end();it++){
if(it->second > nums.size()/2)return it->first;
}
return 0;
}
};
class Solution {
public:
/*algorithm3: voting algorithm
time: O(n) space O(1)
1,2,2
*/
int majorityElement(vector<int>& nums) {
int n = nums.size();
if(n < 1)return -1;
int maj = nums[0],cnt = 1;
for(int i = 1;i < n;i++){
if(maj == nums[i]){
cnt++;
}else{
cnt--;
if(cnt == 0){
maj = nums[i];
cnt++;
}
}
}
cnt = 0;
for(int i = 0;i < n;i++){
if(maj == nums[i])cnt++;
}
if(cnt > n/2)return maj;
return -1;
}
};