[LeetCode] NO. 169 Majority Element

[题目] 

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.

 

[题目解析] 根据题目需要求数组中,出现次数过半的元素。最容易想到的就是直接的去遍历数组计数,然后出现次数过半的即为所求。

 public int majorityElement(int[] nums) {
       int result = 0;
       HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
       for(int i = 0; i < nums.length; i++){
           int num = nums[i];
           if(map.containsKey(num)){
               map.put(num, map.get(num) + 1);
           }else{
               map.put(num,1);
           }
           f(map.get(num) > (nums.length)/2){
               result = num;
           }
       }
       return result;
  }

还有没有其他方法呢?比较容易能想到,如果是一个有序数组,那么中间位置的数一定就是所求。我们可以对数组进行排序。

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

这里用到了排序,其实我们如果求第(n/2)+1小的数,也是可以的。问题就转化成,求第i小的数。

        求第i小的数,可以根据快速排序的思想。快速排序是找一个数作为基准数,一次遍历后令该基准数处于最终排序后的位置,即比它小的数都在左边,大的都在右边。我们可以根据这一思想,随机取一个数,根据该方法求得最终位置后,若该位置即为i,则直接返回。若该位置比i大,则要求的数在i的左边的数组中,转化为子问题。若该位置比i小,则问题转化成求i右边的数组的第i-s小的数(s是该位置左边的元素个数)。最终可求得结果。

        此外,有一种比较巧妙的方法来解决该问题:摩尔投票算法。

        基本思想: 遍历数组,每次删除一对不同的数,则最后剩下的元素即为所求。

        

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

 

posted @ 2016-08-18 00:59  三刀  阅读(137)  评论(0编辑  收藏  举报