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

169. Majority Element

时间:2016-09-10 10:19:34      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:

Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

You may assume that the array is non-empty and the majority element always exist in the array.

Solution 1:

比较naive的想法,遍历数组,用map存数和对应的个数。然后再遍历keyset读出那个次数大于n/2的数。

map用来处理重复个数,和记录相同key不同value变化很有用。

注意

int change=res.get(nums[i])+1;
res.put(nums[i],change);

如果直接res.put(nums[i],res.get(nums[i])++)会出错。并不知道具体原因,个人觉得是不能读value的同时还改变value的值。

public class Solution {
    public int majorityElement(int[] nums) {
        Map<Integer,Integer> res=new HashMap<Integer,Integer>();
        int majority=0;
        for(int i=0;i<nums.length;i++)
        {
            if(!res.containsKey(nums[i]))
            {
                res.put(nums[i],1);
            }
            else
            {
                int change=res.get(nums[i])+1;
                res.put(nums[i],change);
            }
        }
        for(int num:res.keySet())
        {
            if(res.get(num)>(nums.length/2))
            {
                majority=num;
            }
        }
        return majority;
    }
}

看了discussion的解法,觉得自己的太naive了= =

Solution 2:

public int majorityElement2(int[] nums) {
    Map<Integer, Integer> myMap = new HashMap<Integer, Integer>();
    //Hashtable<Integer, Integer> myMap = new Hashtable<Integer, Integer>();
    int ret=0;
    for (int num: nums) {
        if (!myMap.containsKey(num))
            myMap.put(num, 1);
        else
            myMap.put(num, myMap.get(num)+1);
        if (myMap.get(num)>nums.length/2) {
            ret = num;
            break;
        }
    }
    return ret;
}

不需要再用iterator检查keyset,在记录数和次数的同时就可以比较与n/2的大小。

Solution3:

public int majorityElement1(int[] nums) {
    Arrays.sort(nums);
    return nums[nums.length/2];
}

这尼玛简直是作弊啊!!

Solution4: 

Boyer-Moore Majority vote algorithm

https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_majority_vote_algorithm

核心思想就是存一个counter对应canadiate,如果真的有一个choice次数大于一半,那当循环结束的时候counter必然对应majority choice。

public int majorityElement3(int[] nums) {
    int count=0, ret = 0;
    for (int num: nums) {
        if (count==0)
            ret = num;
        if (num!=ret)
            count--;
        else
            count++;
    }
    return ret;
}

因为题目已经说了肯定存在,所以不用再检查是不是大于一半,退出循环的counter肯定对应着majority 。

169. Majority Element

标签:

原文地址:http://www.cnblogs.com/Machelsky/p/5858751.html

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