[LeetCode]剑指 Offer 39. 数组中出现次数超过一半的数字
原创
©著作权归作者所有:来自51CTO博客作者LibreCoder的原创作品,请联系作者获取转载授权,否则将追究法律责任
算法标签 哈希 排序 摩尔投票法
题目简叙
![在这里插入图片描述 [LeetCode]剑指 Offer 39. 数组中出现次数超过一半的数字_LeetCode](https://s2.51cto.com/images/blog/202303/20141735_6417fa7f305828386.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
思路
假设众数
假设当前初始值是众数
如果当前值与众数值相同,那么就票数+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](https://s2.51cto.com/images/blog/202303/20141735_6417fa7f6b372912.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
排序
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](https://s2.51cto.com/images/blog/202303/20141735_6417fa7fa18658102.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
摩尔投票法
如果是目标值,那么数量超出总数的一半,那么我们可以使用摩尔投票法
假设众数
假设当前初始值是众数
如果当前值与众数值相同,那么就票数+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](https://s2.51cto.com/images/blog/202303/20141735_6417fa7fdb94a34588.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
一个无聊的摩尔投票写法
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;
}
};