算法标签 哈希 排序 摩尔投票法

题目简叙

[LeetCode]剑指 Offer 39. 数组中出现次数超过一半的数字_LeetCode

思路

假设众数
假设当前初始值是众数
如果当前值与众数值相同,那么就票数+1
如果当前值与众数值不同,那么就票数-1
如果当前票数为0,那么就证明当前值不是众数,于是我们假定下一个数是众数,重复进行尝试

代码

哈希 没什么好说的

class Solution {
public:
int majorityElement(vector<int>& nums) {
unordered_map<int,int>mp;
for(int it:nums)mp[it]++;

ios::sync_with_stdio(false);

for(int i=0;i<nums.size();i++){
if(mp[nums[i]]>=(nums.size()+1)>>1){//这里的+1是为了向上取整
return nums[i];
}
}

return 0;
}
};

[LeetCode]剑指 Offer 39. 数组中出现次数超过一半的数字_LeetCode_02


排序

class Solution {
public:
int majorityElement(vector<int>& nums) {
ios::sync_with_stdio(false);
sort(nums.begin(),nums.end());
return nums[nums.size()>>1];
}
};

[LeetCode]剑指 Offer 39. 数组中出现次数超过一半的数字_排序_03


摩尔投票法

如果是目标值,那么数量超出总数的一半,那么我们可以使用摩尔投票法

假设众数
假设当前初始值是众数
如果当前值与众数值相同,那么就票数+1
如果当前值与众数值不同,那么就票数-1
如果当前票数为0,那么就证明当前值不是众数,于是我们假定下一个数是众数,重复进行尝试

class Solution {
public:
int majorityElement(vector<int>& nums) {
ios::sync_with_stdio(false);
int vote=0,target=nums[0];

for(int i =0;i<nums.size();i++){
nums[i]==target?vote++:vote--;
if(!vote)target=nums[i+1];
}
return target;
}
};

[LeetCode]剑指 Offer 39. 数组中出现次数超过一半的数字_排序_04

一个无聊的摩尔投票写法

class Solution {
public:
int majorityElement(vector<int>& nums) {
if(nums.size()==1)return nums[0];

ios::sync_with_stdio(false);
int vote=0,target=nums[0];

int i=0;
for(int it:nums)
(it==target?vote++:vote--&&!vote?target=nums[i+1]:1),i++;

return target;
}
};