leetcode:229. 多数元素 II

题目来源

  • 229. 多数元素 II

题目描述

leetcode:229. 多数元素 II_第1张图片

class Solution {
public:
    vector<int> majorityElement(vector<int>& nums) {

    }
};

题目解析

问题:如果要求统计出现次数超过n/k的数,应该怎么做的?

可以证明:出现次数超过n/k的数最多只有k-1个。否则必然违背[数总共只有n个]或者[当前统计的数是出现次数超过n/k的数]的前提条件

比如:对于本题,如果有超过两个,也就是至少三个数字满足“出现的次数大于 n/3”,那么就意味着数组里总共有超过 3*(n/3) = n 个数字,这与已知的数组大小矛盾,所以,只可能有两个或者更少

当明确了符号要求的数的数量之后,我们可以使用有限变量来代表这k-1个候选数以及出现次数。

然后使用「摩尔投票」的标准做法,在遍历数组的同时check这k-1个数,假设当前遍历到的元素为x:

  • 如果x本身就是候选者的话,则对其出现次数加一
  • 如果x本身不是候选者的话,检测是否有候选者的出现次数为0:
    • 如果有,则让x代替其成为候选者,并记录其出现次数为1
    • 如果没有,则让所有候选者的出现次数减一

当遍历完整个数组之后,这k-1个数可能会填满,但不一定都是符号出现次数超过n/k要求的

需要进行二次遍历,来确定候选者是否符合要求,将符合要求的数加到答案。

class Solution {
public:
    vector<int> majorityElement(vector<int>& nums) {
        std::vector<int> ans;
        int ele1 = 0, count1 = 0;
        int ele2 = 0, count2 = 0;
        for(auto num : nums){
            if(count1 > 0 && num == ele1){ //如果该元素为第一个元素,则计数加1
                count1++;
            }else if(count2 > 0 && num == ele2){
                count2++;
            }else if(count1 == 0){
                ele1 = num;
                count1 = 1;
            }else if(count2 == 0){
                ele2 = num;
                count2 = 1;
            }else{//如果三个元素均不相同,则相互抵消1次
                count1--;
                count2++;
            }
        }

        // 检测元素出现的次数是否满足要求
        count1 = count2 = 0;
        for(auto num : nums){
            if(num == ele1){
                count1++;
            }else if(num == ele2){
                count2++;
            }
        }
        
        if(count1 > nums.size() / 3){
            ans.push_back(ele1);
        }
        if(count2 > nums.size() / 3){
            ans.push_back(ele2);
        }
        return ans;
    }
};

类似题目

题目 思路
leetcode:169. 无序数组中的多数元素(超过n/2) majority-element 这里已经确保了主要元素一定存在,所以最后不需要验证
面试题 17.10. 无序数组中的主要元素(超过n/2) find-majority-element-lcci 没有说主要元素一定存在,所以最后需要看major是否是主要元素
leetcode:229. 无序数组中的多数元素 II(超过n/3) majority-element ii
leetcode:1287. 有序数组中出现次数超过25%的元素

你可能感兴趣的:(算法与数据结构,leetcode,算法,职场和发展)