题目描述:
分析:
这道题比较简单,设立一个hash表,来存储数字和他出现的次数,然后对nums数组遍历一遍,如果该数字没有出现过,加入hash表,如果该数字出现过,则给他出现的次数+1,并判断出现的次数是否大于数组长度的一半,如果大于数组长度的一半 ,则返回该数字即可。
代码如下:
class Solution {
public:
int majorityElement(vector<int>& nums) {
// 数组中只有一个元素,直接返回即可
if(nums.size()==1)
return nums[0];
unordered_map<int,int> map;
for(int i=0;i<nums.size();i++)
{
// 如果这个数字已经在hash表中
if(map.find(nums[i])!=map.end())
{
// 次数+1
map[nums[i]]++;
// 如果出现次数大于数字长度一半,直接返回该数字即可
if(map[nums[i]]>(nums.size()/2))
return nums[i];
}
else
// 如果没有出现该数字,加入hash表
map.insert(make_pair(nums[i],1));
}
return 0;
}
};
想看看题解有没有什么新奇方法,K神果然不负众望,又学会了一种摩尔投票法
思路:
然后写代码:
class Solution {
public:
int majorityElement(vector<int>& nums) {
int count=0;
int zs;
for(int i=0;i<nums.size();i++)
{
// 第一次或者之前的count抵消为0,选取新的众数
if(count==0)
{
count++;
zs=nums[i];
continue;
}
// 如果众数的count>0
if(count>0)
{
// 如果当前遇到的还是众数,则count++
if(nums[i]==zs)
count++;
// 如果遇到的不是众数,则count--
else
count--;
}
}
return zs;
}
};