[leetcode]229. Majority Element II

来源:互联网 发布:中兴软件有限责任公司 编辑:程序博客网 时间:2024/05/18 07:21

题目链接:https://leetcode.com/problems/majority-element-ii/#/description

Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space.


思路:


观察可知,数组中至多可能会有2个出现次数超过 ⌊ n/3 ⌋ 的众数

记变量n1, n2为候选众数; c1, c2为它们对应的出现次数

遍历数组,记当前数字为num

若num与n1或n2相同,则将其对应的出现次数加1

否则,若c1或c2为0,则将其置为1,对应的候选众数置为num

否则,将c1与c2分别减1

最后,再统计一次候选众数在数组中出现的次数,若满足要求,则返回之。


class Solution{public:    vector<int> majorityElement(vector<int>& nums)    {        int t1,t2,n1=0,n2=0;        for(int i=0;i<nums.size();i++)        {            if(n1!=0 && t1==nums[i]){++n1;continue;}            if(n2!=0 && t2==nums[i]){++n2;continue;}            if(n1==0){t1=nums[i];++n1;continue;}            if(n2==0){t2=nums[i];++n2;continue;}            n1--;n2--;        }        int z1=0,z2=0;        for(int i=0;i<nums.size();i++)        {            if(n1>0){if(nums[i]==t1) z1++;}            if(n2>0){if(nums[i]==t2) z2++;}        }        vector<int> ret;        if(z1>nums.size()/3) ret.push_back(t1);        if(z2>nums.size()/3) ret.push_back(t2);        return ret;    }};