【Leet Code】229. Majority Element II---Medium

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.

Hint:

  1. How many majority elements could it possibly have?Show More Hint 

思路1:

题目中重点强调出现的次数大于⌊ n/3 ⌋,所以可能有0个、1个或者2个(最多2个)这样的数存在,所以只需要设置2个变量cand1,、cand2来记录出现次数可能大于⌊ n/3 ⌋的数据,分别用count1和count2记录数据出现的次数。

思路2:

另一种最直接的方法就是用map对数组中每个值出现的次数做记录,然后把出现次数大于⌊ n/3 ⌋的值存入返回结果,该方法的缺点是空间复杂度为O(n)。

代码1实现:

class Solution {
public:
    vector<int> majorityElement(vector<int>& nums) {
        vector<int> result;
        if(nums.size() < 1) return result;
        if(nums.size() == 1) return nums;
        int cand1 = 0, cand2 = 0;
        int count1 = 0, count2 = 0;
        
        //找到满足条件的数,可能有一个满足条件的,最多有两个满足条件的
        for(auto num: nums)
        {
            if (count1 == 0)
                cand1 = num;
            else if (count2 == 0)
                cand2 = num;
            
            //处理count的值
            if(cand1 == num)
                ++count1;
            else if(cand2 == num)
                ++count2;
            else
            {
                --count1;
                --count2;
            }
        }
        
        if(count(nums.begin(), nums.end(), cand1) > nums.size() / 3)
            result.push_back(cand1);
        //此处cand1 != cand2一定要判断,否则对于数组[2,2],就会返回[2,2],而期望的结果是[2]
        if(cand1 != cand2 && count(nums.begin(), nums.end(), cand2) > nums.size() / 3)
            result.push_back(cand2);
        
        return result;
        
    }
};

代码实现2:

class Solution {
public:
    vector<int> majorityElement(vector<int>& nums) {
        map<int, int> myMap;
        
        for (auto& num: nums) 
            myMap[num]++;
            
        vector<int> res;
        for (auto it = myMap.begin(); it != myMap.end(); it++) 
            if (it->second > nums.size()/3)
                res.push_back((*it).first);
         return res;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值