求多数元素的几种方法
- 多数元素
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
输入: nums = [3,2,3]
输出: 3
输入: nums = [2,2,1,1,1,2,2]
输出: 2
方法一-摩尔投票法
- 思考:
- 第一步:将第一个元素设为候选人(用于和后面的其他元素比较),然后遍历数组中每一个元素。同时定义count=0
- 第二步:如果遇到相同的则count++,遇到不同的则count-- 若是count==0时,将此时的nums[i]设置为新的候选人
- 重复第二步操作,最后决赛胜出的候选人即为所求的值(成立前提:有出现次数大于n/2的数存在)
class Solution {
public:
int majorityElement(vector<int>& nums) {
//摩尔投票法
int count=0;
int n =nums.size();
int major = nums[0]; //将第一个元素作为候选人
for(int i =0;i<n;i++)
{
if(nums[i]==major) count++;
else count--; //如果遍历的值等于候选人的值则++,否则--
if(count==0)
{
major = nums[i];
count=1; //count重置为1
}
}
return major;
}
};
方法二-哈希法
- 思考:
- 哈希映射(HashMap)来存储每个元素以及出现的次数。对于哈希映射中的每个键值对,键表示一个元素,值表示该元素出现的次数。
class Solution {
public:
int majorityElement(vector<int>& nums) {
//哈希法
unordered_map<int,int> hash;
int n = nums.size();
int result = 0;
for(auto num: nums)
{
hash[num]++;
if(hash[num]>n/2)
{
result=num;
break; //因为只可能存在一个直接break
}
}
return result;
}
};
方法三-直接排序
- 思考:
- 将整个数组直接排序,无论偶数个还是奇数个,下标n/2处一定是众数。
class Solution {
public:
int majorityElement(vector<int>& nums) {
sort(nums.begin(), nums.end());
return nums[nums.size() / 2];
}
};