剑指 Offer 39. 数组中出现次数超过一半的数字
剑指 Offer 39. 数组中出现次数超过一半的数字
思路
1.比较容易想到的,哈希表
2.排序数组,输出中位数
3.摩尔投票法
初始化vote=0
众数x
比较难想,简而言之就是假设第一个数是众数,x=nums[0],vote加一。
后面依次遍历:
nums[i]==x, vote++;
nums[i]!=x, vote--;
每次vote==0时,更新x:x=nums[i]
最后一轮的x就是众数
代码
1.哈希表
class Solution {
public:
int majorityElement(vector<int>& nums) {
if(nums.size()==1)
return nums[0];
int len=nums.size()/2+1;
map<int,int> hash;
for(int i=0;i<nums.size();i++)
{
if(hash[nums[i]]==0)
{
hash[nums[i]]=1;
}else
{
hash[nums[i]]++;
if(hash[nums[i]]==len)
{
return nums[i];
}
}
}
return 0;
}
};
2.排序输出中位数
class Solution {
public:
int majorityElement(vector<int>& nums) {
if(nums.size()==1)
return nums[0];
int len=nums.size()/2;
sort(nums.begin(),nums.end());
return nums[len];
}
};
3.摩尔投票
class Solution {
public:
int majorityElement(vector<int>& nums) {
int vote=0;
int x;
for(int i=0;i<nums.size();i++)
{
if(vote==0)
x=nums[i];
vote+=nums[i]==x?1:-1;
//cout<<vote<<endl;
}
return x;
}
};
时间对比


浙公网安备 33010602011771号