常规思路是遍历数组,使用哈希表存储各个数字出现的次数,很容易求出结果。但是时空复杂度都为O(n),不满足本题的额外要求。
优化解法参考自官方题解
优化解法:摩尔投票法
摩尔投票法的核心就是四个字“对拼内耗”,我们通过不同元素的对拼内耗,不断消耗数组内元素,根据我们寻找众数的条件,选择不同规模的对拼内耗,如果存在满足条件的众数,那么一定是在对拼内耗中存活下来的。我们只需要重新遍历一遍数组,幸存的元素统计数量判断是否满足要求就好。
在本题中,我们寻找数量大于n/3的数字,易知最多存在两个元素满足条件,那我们选择每次三个元素对拼内耗,对幸存的两个元素进行检查。
摩尔投票法思路求解时间复杂度O(n),空间复杂度O(1);
做本题前可先做简单版->LeetCode169-多数元素(求众数I)
class Solution
{
public:
vector<int> majorityElement(vector<int> &nums)
{
//摩尔投票法
int data1