题目详情

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.

输入一个大小为n的数组,整个数组里面将会含有一个众数,即这个元素出现的次数大于n/2,我们需要找到并返回这个众数

思路

  • 这道题也是一道关于数组的重复元素的问题
  • 首先我想到的办法是,使用HashMap实现,key是元素的值,value则是这个元素在当前出现的次数,一旦这个次数大于n/2,我们就可以停止我们的遍历
  • 但实际上,还有一种更简单的方法。因为众数出现的次数必定大于n/2,所以我们只要取第n/2个位置上的元素,这个元素一定为我们要找的众数。
  • 感谢@SegmentWarrior提供的解法三,不需要建立hashmap所产生的额外空间,同时时间复杂度为O(n)

解法一 HashMap

    //HashMap实现 时间复杂度O(n)
    public int majorityElement(int[] nums) {
        HashMap<Integer, Integer> count = new HashMap<Integer, Integer>();
        int length = nums.length;
        if(length<=1){
            return nums[0];
        }
        for(int i=0;i<length;i++){
            if(count.get(nums[i]) != null){
                int temp = count.get(nums[i]);
                count.put(nums[i],temp+1);  
                if(temp+1 > length/2){
                    return nums[i];
                }
            }else{
                count.put(nums[i], 1);
            }

        }
        
        return -1;
    }

解法二 直接取n/2位置元素

    //思想:对于一个排序好的数组,第n/2的位置的元素一定是存在的这个众数
    public int majorityElement(int[] nums) {
        
        Arrays.sort(nums);
        return nums[nums.length/2];
    }

解法三 对出现次数计数

    public int majorityElement(int[] nums) {
        int res = nums[0];
        int count = 1;
        
        for(int i=1;i<nums.length;i++){
            if(nums[i] == res) count ++;
            else if(count >1) count --;
            else res = nums[i];
        }
        return res;
    }

soleil阿璐
350 声望45 粉丝

stay real ~