求众数,超过三分之一怎么找呢?

给定一个大小为n的整数数组,找出其中所有超过n/3次的元素,可能有两个,可能有一个,可能没有。

一半我会求可以用异或,三分之一怎么办?

摩尔投票法


public class Solution229 {


    /**
     * 摩尔投票法,一次遍历,时间 O(n),空间O(1)
     */
    public List<Integer> majorityElement(int[] nums) {
        int v1 = 0, v2 = 0;
        int t1 = 0, t2 = 0;
        for (int v : nums) {
            if (v == v1) {
                t1++;
            } else if (v == v2) {
                t2++;
            } else if (t1 == 0) {
                v1 = v;
                t1 = 1;
            } else if (t2 == 0) {
                v2 = v;
                t2 = 1;
            } else {
                t1--;
                t2--;
            }
        }
        t1 = t2 = 0;
        for (int v : nums) {
            if (v == v1) {
                t1++;
            } else if (v == v2) {
                t2++;
            }
        }
        List<Integer> rst = new LinkedList<>();
        if (t1 > nums.length / 3) {
            rst.add(v1);
        }
        if (t2 > nums.length / 3) {
            rst.add(v2);
        }
        return rst;
    }

    /*
    Hash 方法,需要额外空间,时间 O(n),空间 O(n)
    public List<Integer> majorityElement(int[] nums) {
        Map<Integer, Integer> map = new TreeMap<>();
        for (int v : nums) {
            map.put(v, map.getOrDefault(v, 0) + 1);
        }
        List<Integer> list = new LinkedList<>();
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if (entry.getValue() > nums.length / 3) {
                list.add(entry.getKey());
            }
        }
        return list;
    }
     */

    public static void main(String[] args) {
        Solution229 solution = new Solution229();
        printVals(solution.majorityElement(new int[] {
                1, 2
        }));
    }
}

这跟异或有什么关系,1,1,1,2,3,你能给我异或个1出来?
不就是统计每个数出现的次数,然后再判断一下是否超过n/3次吗
关键是统计每个数出现的次数,你可以用字典;也可以用两个list,一个存数,一个存次数;或者一个足够长的二维数组,总之就是你会用的任何结构来存
剩下的到底是一半还是1/3还是1/18,那就是个循环判断的事,爱多少多少