leetCode 229. 多数元素 II + 摩尔投票法 + 进阶 + 优化空间

229. 多数元素 II - 力扣(LeetCode)


给定一个大小为 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。

leetCode 229. 多数元素 II + 摩尔投票法 + 进阶 + 优化空间_第1张图片

进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1)的算法解决此问题。 


(1)哈希表

class Solution {
public:
    // 哈希
    vector majorityElement(vector& nums) {
        unordered_map mp;
        for(const int& a:nums) mp[a]++;
        int n = nums.size() / 3;
        int i=0;
        vector ans;
        for(auto &it:mp) {
            if(it.second > n) ans.push_back(it.first); 
        }
        return ans;
    }
};

(2) 摩尔投票法

class Solution {
public:
    // 摩尔投票法
    vector majorityElement(vector& nums) {
        // 创建返回值
        vector res;
        if (nums.empty() || nums.size() == 0) return res;
        // 初始化两个候选人candidate,和他们的计票
        int cand1 = nums[0],count1 = 0;
        int cand2 = nums[0],count2 = 0;

        // 摩尔投票法,分为两个阶段:配对阶段 和 计数阶段
        // (1) 配对阶段
        for(const int &num : nums) {
            // 投票
            if(cand1 == num) {count1++;continue;}
            if(cand2 == num) {count2++;continue;}

            // 第 1 个候选人配对
            if(count1 == 0) {
                cand1 = num;
                count1++;
                continue;
            }

            // 第 2 个候选人配对
            if(count2 == 0) {
                cand2 = num;
                count2++;
                continue;
            }

            count1--;
            count2--;
        }

        // (2)计数阶段 : 找到了两个候选人之后,需要确定票数是否满足大于 N/3
        count1=0;
        count2=0;
        for(const int &num : nums) {
            if (cand1 == num) count1++;
            else if (cand2 == num) count2++;
        }

        if (count1 > nums.size() / 3) res.push_back(cand1);
        if (count2 > nums.size() / 3) res.push_back(cand2);
        return res;
    }
};

推荐和参考文章:

229. 多数元素 II - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/majority-element-ii/solutions/123170/liang-fu-dong-hua-yan-shi-mo-er-tou-piao-fa-zui-zh/229. 多数元素 II - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/majority-element-ii/solutions/1060343/gong-shui-san-xie-noxiang-xin-ke-xue-xi-ws0rj/

你可能感兴趣的:(摩尔投票法,leetcode,摩尔投票法,进阶)