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

Majority Element

原题链接Majority Element

给定一个数组,元素个数为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

找到所有出现次数大于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)