求众数(摩尔投票法)

求众数II
思路:摩尔投票法

class Solution {
public:
    vector<int> majorityElement(vector<int>& nums) {
        vector<int> res;
        if(nums.empty())
            return{};
        int first_candidate=nums[0],first_candidate_counter=0;
        int second_candidate=nums[0],second_candidate_counter=0;
        for(int num:nums)
        {
            if(num==first_candidate)
                first_candidate_counter++;
            if(num==second_candidate)
                second_candidate_counter++;
            if(num!=first_candidate&&num!=second_candidate)
            {
                if(first_candidate==second_candidate)
                {
                    second_candidate=num;
                    second_candidate_counter=1;
                }
                else
                {
                    if(second_candidate_counter-1<0||first_candidate_counter-1<0)
                    {
                        if(second_candidate_counter-1<0&&first_candidate_counter-1<0)
                        {
                            second_candidate=first_candidate=num;
                            second_candidate_counter=first_candidate_counter=1;
                        }
                        else if(second_candidate_counter-1<0)
                        {
                            second_candidate_counter=1;
                            second_candidate=num;
                        }
                        else
                        {
                            first_candidate_counter=1;
                            first_candidate=num;
                        }
                    }
                    else
                    {
                        first_candidate_counter--;
                        second_candidate_counter--;
                    }
                }
            }
        }
        first_candidate_counter=0;
        second_candidate_counter=0;
        for(int num:nums)
        {
            if(num==first_candidate)
                first_candidate_counter++;
            if(num==second_candidate)
                second_candidate_counter++;
        }
        if(3*first_candidate_counter>nums.size())
            res.push_back(first_candidate);
        if(3*second_candidate_counter>nums.size())
            res.push_back(second_candidate);
        if(first_candidate==second_candidate&&!res.empty())
            res.pop_back();
        return res;
    }
};

多数元素

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int candidate,candidate_counter=0;
        for(int num:nums)
        {
            if(candidate_counter==0)
            {
                candidate=num;
                candidate_counter=1;
            }
            else
            {
                if(candidate==num)
                    candidate_counter++;
                else
                    candidate_counter--;
            }
        }
        return candidate;
    }
};
posted @ 2020-08-19 11:48  周颖  阅读(14)  评论(0)    收藏  举报