//排序法
class Solution
{
public:
int majorityElement(vector<int> &nums)
{
sort(nums.begin(), nums.end());
return nums[nums.size() / 2];
}
};
//哈希表
class Solution
{
public:
int majorityElement(vector<int> &nums)
{
//创建unordered_map容器,记录key对应的value
unordered_map<int, int> times;
//多数元素,多数元素的出现次数
int majority = 0, count = 0;
for (int num : nums) //遍历数组
{
++times[num]; //将数组元素插入哈希表
if (times[num] > count) //更新majority和count
{
majority = num;
count = times[num];
}
}
return majority; //返回多数元素
}
};
//随机查找
class Solution
{
public:
int majorityElement(vector<int> &nums)
{
while (true)
{
//利用求余法获取随机数字,令count初始为0
int random = nums[rand() % nums.size()], count = 0;
for (int num : nums) //遍历数组
{
if (num == random)
{
//统计random在数组中的出现次数
count++;
}
}
//如果random的出现次数超过一半,则为多数元素
if (count > nums.size() / 2)
{
return random;
break;
}
}
}
};
//摩尔投票法:多数元素的个数-其余元素的个数总和>=1
class Solution
{
public:
int majorityElement(vector<int> &nums)
{
//初始化候选数为nums[0],票数为1;
int cand_num = nums[0], count = 1, len = nums.size();
//从第2个元素开始遍历数组
for (int i = 1; i < len; i++)
{
//遇到相同的数
if (nums[i] == cand_num)
{
//票数加一
count++;
}
//遇到不同的数,票数减一
else if (--count == 0)
{
//如果票数为0,更换候选数
cand_num = nums[i];
// count重置为1
count = 1;
}
}
return cand_num;
}
};