欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

每天一道LeetCode-----摩尔投票法寻找给定数组中出现个数大于n/2或n/3的元素

程序员文章站 2024-03-16 14:34:16
...

Majority Element

原题链接Majority Element

每天一道LeetCode-----摩尔投票法寻找给定数组中出现个数大于n/2或n/3的元素

给定一个数组,元素个数为n,找出出现次数大于n/2的那个元素

摩尔投票法思想

每次从数组中选择两个不相等的元素进行相互抵消(删除),最后剩下的一个元素或几个相同的元素就是出现次数大于n/2的元素

代码如下

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int major = 0, count = 0;
        for(auto& n : nums)
        {
            if(major == n)  ++count;
            else if(count == 0) major = n, count = 1;
            else    --count;
        }
        return major;
    }
};

Majority Element II

原题链接Majority Element II

每天一道LeetCode-----摩尔投票法寻找给定数组中出现个数大于n/2或n/3的元素

找到所有出现次数大于n/3的元素,显然最多只能有两个,同样利用摩尔投票法

代码如下

class Solution {
public:
    vector<int> majorityElement(vector<int>& nums) {
        int y = 0, z = 0, cy = 0, cz = 0;
        for(auto& x : nums)
        {
            if(y == x) ++cy;
            else if(z == x) ++cz;
            else if(cy == 0) y = x, cy = 1;
            else if(cz == 0) z = x, cz = 1;
            else --cy, --cz;
        }
        cy = cz = 0;
        for(auto& x : nums)
        {
            if(y == x)  ++cy;
            else if(z == x) ++cz;
        }
        vector<int> res;
        if(cy > nums.size() / 3)    res.push_back(y);
        if(cz > nums.size() / 3)    res.push_back(z);
        return res;
    }
};
相关标签: leetcode