Medium

Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times.

Note: The algorithm should run in linear time and in O(1) space.

Example 1:

Input: [3,2,3]
Output: [3]

Example 2:

Input: [1,1,1,3,3,2,2,2]
Output: [1,2]


题目大意:
找到数列中出现次数大于n/3的数字

方法:
题目限制运行时间是线性的,所占空间为常数级。
使用摩尔投票的方法。每个数列中出现次数超过n/3的元素最多为两个(如果超过2个元素出现次数大于n/3:假设有3个元素出现次数超过n/3,那么3*time>n,(time>n/3),所以最多有两个元素出现次数超过n/3),那么先选出两个可能的目标元素,然后看这两个元素否都符合条件即可。
参考:https://www.cnblogs.com/grandyang/p/4606822.html
代码如下:
class Solution {
public:
    vector<int> majorityElement(vector<int>& nums) {
        if(nums.empty())return {};
        vector<int> res;
        int len=nums.size();
        int a=0,b=0,num_a=0,num_b=0;
        for(int num:nums){
            if(num==a)num_a++;
            else if(num==b)num_b++;
            else if(num_a==0){a=num;num_a=1;}
            else if(num_b==0){b=num;num_b=1;}
            else{num_a--,num_b--;}
        }
        num_a=num_b=0;
        for(int num:nums){
            if(num==a){num_a++;}
            else if(num==b){num_b++;}
        }
        if(num_a>len/3)res.push_back(a);
        if(num_b>len/3)res.push_back(b);
        return res;
    }
};
01-15 05:08