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.
Solution 1:
class Solution {
public:
int majorityElement(vector<int> &num) {
map<int, int> count;
for(int i = 0; i < num.size(); i++)
{
if(++count[num[i]] > num.size()/2)
return num[i];
}
}
};
Solution 2:
class Solution {
public:
int majorityElement(vector<int> &num) {
return helper(num, 0, num.size()-1);
}
private:
int helper(vector<int> &num, int start, int end)
{
if(start == end)
return num[start];
else
{
int mid = (start + end)/2;
int left = helper(num, start, mid);
int right = helper(num, mid+1, end);
if(left == right)
return left;
else
{
int countA = 0, countB = 0;
for(int i = start; i <= end; i++)
{
if(num[i] == left)
countA++;
else if(num[i] == right)
countB++;
}
return countA > countB ? left : right;
}
}
}
};
class Solution {
public:
int majorityElement(vector<int> &num) {
int countOne = 0, countZero = 0;
int result = 0;
for(int i = 0; i < 32; i++)
{
countOne = 0;
countZero = 0;
for(int j = 0; j < num.size(); j++)
{
if((num[j] & (1 << i)) >> i)
countOne++;
else
countZero++;
}
if(countOne > countZero)
{
result |= 1 << i;
}
}
return result;
}
};
Round 3:
class Solution {
public:
int majorityElement(vector<int>& nums) {
int result = 0;
for(int i = 0; i < 32; i++)
{
int count = 0;
for(int j = 0; j < nums.size(); j++)
{
count += ((nums[j]>> i) & 1);
}
if(count > nums.size()/2)
{
result |= (1 << i);
}
}
return result;
}
};