Leetcode - Majority Element

My code:

import java.util.HashMap;

public class Solution {
    public int majorityElement(int[] nums) {
        if (nums == null || nums.length == 0)
            return 0;
        if (nums.length == 1)
            return nums[0];
        HashMap<Integer, Integer> h = new HashMap<Integer, Integer>();
        int upLimit = nums.length / 2;
        for (int i = 0; i < nums.length; i++) {
            if (!h.containsKey(nums[i]))
                h.put(nums[i], 1);
            else {
                int temp = h.get(nums[i]);
                temp++;
                if (temp > upLimit)
                    return nums[i];
                else
                    h.put(nums[i], temp);
            }   
        }
        return 0;
    }
}

My test result:

这次作业感觉还是比较简单吧。我用了一个hash map。
key -> nums[i] value-> nums[i] 出现的次数。
如果 > n /2; 就直接返回吧。

但是还有许多做法,此题。比如,排序,然后直接去数组中间值。
因为,出现次数 > n /2, 所以这个数一定会包括最中间的那个值。链接如下:
http://www.programcreek.com/2014/02/leetcode-majority-element-java/

public int majorityElement(int[] nums) {
    Integer n = null;
    int c = 0;
    for (int i = 0; i < nums.length; i++) {
        if (n != null && n.compareTo(nums[i]))
            c++;
        else if (c == 0)
            n = new Integer(nums[i]);
        else if (n == null) {
            c = 1;
            n = new Integer(nums[i]);
        }
        else if (!n.compareTo(nums[i])) {
            c--;
        }
    }
    c = 0;
    for (int i = 0; i < nums.length; i++) {
        if (n.compareTo(nums[i]))
            c++;
    }
    
    if (c >= (nums.length / 3))
        return n;
    else
        return null;
}

http://www.programcreek.com/2014/07/leetcode-majority-element-ii-java/
**
总结:Array。简单
**

Anyway, Good luck, Richardo!

My code:

public class Solution {
    public int majorityElement(int[] nums) {
        if (nums == null || nums.length == 0)
            return -1;
        int major = nums[0];
        int counter = 1;
        for (int i = 1; i < nums.length; i++) {
            if (major != nums[i]) {
                counter--;
                if (counter == 0) {
                    major = nums[i];
                    counter = 1;
                }
            }
            else
                counter++;
        }
        return major;
    }
}

直接用投票算法做的,比较简单。

然后我改写了下形式,使得更加直接明了,并且可以应对数组中不存在majority的情况。代码如下:

public class Solution {
    public int majorityElement(int[] nums) {
        if (nums == null || nums.length == 0)
            return -1;
        Integer c1 = null;
        int counter1 = 0;
        for (int i = 0; i < nums.length; i++) {
            if (c1 != null && c1.intValue() == nums[i])
                counter1++;
            else if (counter1 == 0)
                c1 = new Integer(nums[i]);
            else
                counter1--;
        }
        
        /** make sure whether this element is majority */
        if (c1 == null)
            return -1; // means has no majority
        counter1 = 0;
        for (int i = 0; i < nums.length; i++)
            if (nums[i] == c1.intValue())
                counter1++;
        if (counter1 > nums.length / 2)
            return c1.intValue();
        else
            return -1;
    }
}

具体总结见 Majority 2
http://www.jianshu.com/p/3ccbc915f3a1

Anyway, Good luck, Richardo!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容