力扣:多数元素
题目描述:
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例一:
输入:[3,2,3]
输出:3
示例二:
输入:[2,2,1,1,1,2,2]
输出:2
解法1️⃣(排序,取下标为[n/2]的元素即可):
class Solution {
public:
int majorityElement(vector<int>& nums) {
sort(nums.begin(),nums.end());
return nums[nums.size()/2];
}
};
解法2️⃣(哈希表计数):
class Solution {
public:
int majorityElement(vector<int>& nums) {
unordered_map<int,int>mp;
for(int i:nums)mp[i]++;
int jie=0;
for(auto it:mp){
if(it.second>nums.size()/2){
jie=it.first;
break;
}
}
return jie;
}
};
解法3️⃣(随机化算法):如著名的Miller-Rabin算法(对大整数进行素数判断)
class Solution {
public:
int majorityElement(vector<int>& nums) {
while (true) {//由于一定能找到结果,不用担心死循环
int target = nums[rand() % nums.size()];
int cnt = 0;
for (auto it : nums)
if (it == target){
++cnt;
if (cnt > nums.size() / 2)
return target;
}
}
return -1;//象征性地返回-1
}
};
(注:随机化算法,时间复杂度平均为O(n),这里的执行用时波动很大)