169.多数元素
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:nums = [3,2,3]
输出:3
示例 2:
输入:nums = [2,2,1,1,1,2,2]
输出:2
提示:
n == nums.length
1 <= n <= 5 * 104
-109 <= nums[i] <= 109
解题思路
代码一
最常用的,哈希表进行映射
class Solution {
public:
int majorityElement(vector<int>& nums) {
unordered_map<int, int> counts;
int majority = 0, cnt = 0;
for (int num: nums) {
++counts[num];
if (counts[num] > cnt) {
majority = num;
cnt = counts[num];
}
}
return majority;
}
};
代码二
排序,然后进行连续统计,不符合的直接排除
class Solution {
public:
int majorityElement(vector<int>& nums) {
int n=nums.size();
int t=n/2;
sort(nums.begin(),nums.end());
int count=1;
int x=0;
for(int i=1;i<n;i++){
if(nums[i-1]!=nums[i]){
count=1;
x=i;
}
else {
count++;
if(count>t)
break;
}
}
return nums[x];
}
};
但根据排序的结果来看,众数的数量最多,那么一定覆盖了size/2的点,排序之后直接返回值就行,优化上面的再次遍历数组
class Solution {
public:
int majorityElement(vector<int>& nums) {
sort(nums.begin(), nums.end());
return nums[nums.size() / 2];
}
};
代码三
当个开阔思路的吧
Boyer-Moore 投票算法,如果我们把众数记为 +1,把其他数记为 −1,将它们全部加起来,显然和大于 0,从结果本身我们可以看出众数比其他数多。
步骤:
我们遍历数组 nums 中的所有元素,对于每个元素 x,在判断 x 之前,如果 count 的值为 0,我们先将 x 的值赋予 candidate,随后我们判断 x:
①如果 x 与 candidate 相等,那么计数器 count 的值增加 1;②如果 x 与 candidate 不等,那么计数器 count 的值减少 1。
class Solution {
public:
int majorityElement(vector<int>& nums) {
int candidate = -1;
int count = 0;
for (int num : nums) {
if (num == candidate)
++count;
else if (--count < 0) {
candidate = num;
count = 1;
}
}
return candidate;
}
};