229. Majority Element II | Java最短代码实现

原题链接:229. Majority Element II

【思路】

1. 超过n/3元素个数最多只有2个,记为num1和num2

2. 数组中连续3个数据为一组的话,一共n/3组,那么如果存在符合条件的元素,这个元素一定出现在某一个组内两次

3. 知道了以上两个条件后,用所谓的摩尔投票法,共两轮,

     第一轮:找出出现次数最多的两个元素,每次存储两个元素num1和num2,如果第三个元素与其中一个相同,则增加计数c1或c2,  否则,清除n1和n2,从下一个数据开始重新统计.

             根据第二条,数目较多的元素一定可以被查到,当然查到的不一定是大于n/3的.

     第二轮:验证这两个元素是否满足条件,即出现的次数是否大于n/3;

    public List<Integer> majorityElement(int[] nums) {
        List<Integer> result = new ArrayList<Integer>();
        if (nums == null || nums.length == 0) return result;
        if (nums.length == 1) {
            result.add(nums[0]);
            return result;
        }
        int num1 = 0;
        int num2 = 0;
        int c1 = 0;
        int c2 = 0;
        for (int num : nums) {
            if (num1 == num) c1++;
            else if (num2 == num) c2++;
            else if (c1 < 1) {
                c1 = 1;
                num1 = num;
            } else if (c2 < 1) {
                c2 = 1;
                num2 = num;
            } else {
                c1--;
                c2--;
            }
        }
        c1 = 0;
        c2 = 0;
        for (int num : nums) {
            if (num == num1) c1++;
            else if (num == num2) c2++;
        }
        if (c1 > nums.length / 3) result.add(num1);
        if (c2 > nums.length / 3) result.add(num2);
        return result;
    }
65 / 65  test cases passed. Runtime: 3 ms  Your runtime beats 74.81% of javasubmissions.
欢迎优化!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值