数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2
限制:
1 <= 数组长度 <= 50000
解法一(摩尔投票法)
int majorityElement(vector<int>& nums) {
if(CheckInvalidArray(nums)) return -1;
int result = nums[0];
int times = 0;
for(int i=0; i<nums.size(); i++){
if(nums[i]==result){
times++;
}
else{
times--;
if(times==0){
result = nums[i];
times = 1;
}
}
}
return result;
}
bool CheckInvalidArray(vector<int>&numbers){
if(numbers.empty() && numbers.size()<=0){
return true;
}
else return false;
}
解法二(排序)
class Solution {
public:
int majorityElement(vector<int>& nums) {
if(CheckInvalidArray(nums)) return -1;
sort(nums.begin(), nums.end());
return nums[nums.size()/2];
}
bool CheckInvalidArray(vector<int>&numbers){
if(numbers.empty() && numbers.size()<=0){
return true;
}
else return false;
}
};
解法三(哈希)
class Solution {
public:
int majorityElement(vector<int>& nums) {
unordered_map <int, int> mp;
for(int n:nums)
if(++ mp[n] > nums.size()/2) return n;
return -1;
}
bool CheckInvalidArray(vector<int>&numbers){
if(numbers.empty() && numbers.size()<=0){
return true;
}
else return false;
}
};
解法四(位运算)
class Solution {
public:
int majorityElement(vector<int>& nums) {
int ans = 0;
for(int i=0; i<32; i++){
int one_num = 0;
for(int n:nums){
one_num += ((n>>i)&1);
}
if(one_num > nums.size() / 2){
ans ^= (1<<i);
}
}
return ans;
}
bool CheckInvalidArray(vector<int>&numbers){
if(numbers.empty() && numbers.size()<=0){
return true;
}
else return false;
}
};