找出数组中出现次数超过n/2(n/3)次的数

时间O(n),空间O(1)

LeetCode 169. 找出数组中出现次数超过n/2次的数

http://blog.csdn.net/chfe007/article/details/42919017

基本原理:每次都找出一对不同的元素,从数组中删掉,直到数组为空或只有一种元素。 不难证明,如果存在元素e出现频率超过半数,那么数组中最后剩下的就只有e。


LeetCode 229. 找出数组中出现次数超过n/3次的数

基本原理:每次都找出3个互不相同的元素,从数组中删掉。最后留下2个数,重新扫描一遍确认下就可以了。

class Solution {
public:
    vector<int> majorityElement(vector<int>& nums) {
        vector<int> ret;
        size_t n = nums.size();
        int a = 0, b = 0, cnt_a = 0, cnt_b = 0;
        for (auto ite: nums)
        {
            if (a == ite) ++cnt_a;
            else if (b == ite) ++cnt_b;
            else
            {
                if (cnt_a == 0)
                {
                    a = ite;
                    cnt_a = 1;
                }
                else if (cnt_b == 0)
                {
                    b = ite;
                    cnt_b = 1;
                }
                else
                {
                    --cnt_a;
                    --cnt_b;
                }
            }
        }
        cnt_a = 0;
        cnt_b = 0;
        for (auto ite: nums)
        {
            if (a == ite) ++cnt_a;
            else if (b == ite) ++cnt_b;
        }
        if (cnt_a > n / 3) ret.push_back(a);
        if (cnt_b > n / 3) ret.push_back(b);
        return ret;
    }
};


点赞