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.
Example 1:
Input: [3,2,3]
Output: 3
Example 2:
Input: [2,2,1,1,1,2,2]
Output: 2
方法一:Hash Table(可扩展)
class Solution {
public:
int majorityElement(vector<int>& nums) {
map<int, int> counts;
int n = nums.size();
for (int i = 0; i < n; i++)
if (++counts[nums[i]] > n / 2) //将数字插入无序映射容器并计数,大于n/2即可
return nums[i];
}
};
方法二:Moore Voting Algorithm(前提是最大元素的数量大于N/2)
注:此种情形下执行效率高效
class Solution {
public:
int majorityElement(vector<int>& nums) {
int major, counts = 0, n = nums.size();
for (int i = 0; i < n; i++) {
if (!counts) { //随机找个数参考,最终会找出大于N/2的数
major = nums[i];
counts = 1;
}
else
{
counts += (nums[i] == major) ? 1 : -1; //如果和随机数相同,则加1,(可以想象成Majority Element是1,其他元素是-1)
}
}
return major;
}
};
方法三:Bit Manipulation
class Solution {
public:
int majorityElement(vector<int>& nums) {
int major = 0, n = nums.size();
for (int i = 0, mask = 1; i < 32; i++, mask <<= 1) {
int bitCounts = 0;
for (int j = 0; j < n; j++) {
if (nums[j] & mask) bitCounts++;
if (bitCounts > n / 2) // Majority Element的第i位是1时,求和肯定超过N/2
{
major |= mask;
break;
}
}
}
return major;
}
};