码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode 169. Majority Element

时间:2021-02-23 14:06:57      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:程序员   public   参考   follow   gre   ++   结果   target   数据结构   

题目描述

题目链接

思路1 Hash表

很直接,代码略

由于题目的follow-up要求空间复杂度O(1),所以,这个方法其实并不是最优解。

思路2 一次删除两个不同的数

一次删除两个不同的数,如果存在majority element,那么这个majority element一定会最后剩下来,

但是,不能说一次删除两个不同的数,最后剩下了来的数就是majority element,

比如{1,2,3,4,5} 这个数组,

最后剩下5,但是,5不是要求的值。

所以,在执行完每次删除两个不同的数这个操作后, 最后留下的数,还要过一遍数组,看下这个数是不是超过了半数,如果超过半数,才算是最后结果。

完整代码见:

public static int majorityElement(int[] nums) {
    if (nums == null || nums.length == 0) {
        return -1;
    }
    if (nums.length == 1) {
        return nums[0];
    }
    
    int cand = nums[0];
    int HP = 1;
    int i = 1;
    int limit = nums.length >> 1;
    while (i < nums.length) {
        if (cand == nums[i]) {
            HP++;
            // 如果某时,HP已经大于一半的数了,直接返回
            if (HP > limit) {
                return nums[i];
            }
        } else {
            if (HP == 0) {
                cand = nums[i];
                HP++;
            } else {
                HP--;
            }
        }
        i++;
    }
    if (HP == 0) {
        return -1;
    }
    int c = 0;
    for (int num : nums) {
        if (cand == num) {
            c++;
        }
    }
    if (c > limit) {
        return cand;
    } else {
        return -1;
    }
}

说明:

其中HP标识候选数出现的次数,我们可以假设侯选数一开始就是num[0],

只要遍历到的数和候选数一致,HP++,不一致,直接HP归零,

侯选数置为当前数,这样就实现了一次删除两个数的目的。

此外,这里有一个小的贪心,就是当HP已经到达数组一半以上的大小时候,直接返回当前的候选数(因为HP就表示侯选数出现的次数)

更多

算法和数据结构笔记

参考资料

LeetCode 169. Majority Element

标签:程序员   public   参考   follow   gre   ++   结果   target   数据结构   

原文地址:https://www.cnblogs.com/greyzeng/p/14410280.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!