169. 求众数

题目描述:
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
**

方法一:Moore majority vote algorithm(摩尔投票算法)

**
题目看似很简单,但是很难找到思路,后来我学习了摩尔投票法,结合这道题目,发现众数的个数一定是要大于整个数组的1/2的,所以众数的数量只有一个,这也是摩尔投票法的核心思想,我们解题的思路就是,将众数和其他数进行相抵,到最后剩下的一定是众数,仅仅从众数的个数出发考虑,这道题就很简单了

class Solution {
    public int majorityElement(int[] nums) {
        //记录次数
        int count=0;
        int result = nums[0];
        for(int num : nums)
        {
            if(count==0)
            {
                result = num;
                count++;
            }
            else
            {
                if(num==result)
                {
                    count++;
                }
                else
                {
                    count--;
                }
            }
        }
        return result;
    }
}

方法二:通过HashMap

class Solution {
    public int majorityElement(int[] nums) {
        HashMap hm = new HashMap();
        for(int num : nums)
        {
            Integer count = hm.get(num);
            if(count == null)
            {
                count=1;
            }
            else
            {
                count++;
            }
            hm.put(num,count);
            if(hm.get(num) > nums.length/2)
            {
                return num;
            }
        }
        return 0;
    }
}

方法三:一种比较取巧的方法,先对数字排序,由于众数的个数大于数组长度的1/2,因此数组中间的数,就是众数。

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

你可能感兴趣的:(leetcode)