剑指 Offer 39. 数组中出现次数超过一半的数字

暴力法:

class Solution {
    public int majorityElement(int[] nums) {
        //最容易想到暴力法
        int n = nums.length;
        if(n==1) return nums[0];
        Map<Integer,Integer> map = new HashMap<>();
        for (int num : nums) {
            if (map.containsKey(num)) {
                int x = map.get(num);
                if (x == n / 2) return num;
                map.put(num, x + 1);
            } else {
                map.put(num, 1);
            }
        }
        return -1;
    }
}

剑指 Offer 39. 数组中出现次数超过一半的数字

 方法二:先排序

class Solution {
    public int majorityElement(int[] nums) {
        //先对数组进行排序
        Arrays.sort(nums);
        int count = 1;
        int i = 1;
        int n = nums.length;
        if(n == 1) return nums[0]; 
        while(i<n){
            if(nums[i] == nums[i-1]) {
                if (count == n / 2) return nums[i];
                else {
                    count++;
                    i++;
                }
            }else{
                i++;
                count = 1;
            }
        }
        return -1;
    }
}

剑指 Offer 39. 数组中出现次数超过一半的数字

 方法三:双指针

class Solution {
    public int majorityElement(int[] nums) {
        Arrays.sort(nums);  //双指针
        int i = 0,j=1;
        int n = nums.length;
        if(n == 1) return nums[0];
        while(j<n){
            if(nums[j] == nums[i]){
                j++;
            }else{
                if(j-i>n/2) return nums[j-1];
                i = j;
                j++;
            }
        }
        return nums[j-1];
    }
}

剑指 Offer 39. 数组中出现次数超过一半的数字

 方法4:

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

剑指 Offer 39. 数组中出现次数超过一半的数字


快速排序,,,

class Solution {
    public int majorityElement(int[] nums) {
        int n  = nums.length;
        sort(nums,0,n-1);
        int mid = n/2;
        return nums[mid];
    }

    private void sort(int[] nums, int start, int end) {
        int left = start-1;
        int right = end+1;
        int p = start;
        int num = nums[(left+right)/2];
        while(p<right){
            if(nums[p]<num){
                swap(p++,++left,nums);
            }else if(nums[p]>num){
                swap(p,--right,nums);
            }else p++;
        }
        if(left>start) sort(nums,start,left);
        if(right<end) sort(nums,right,end);

    }

    private void swap(int i, int small, int[] nums) {
        int temp = nums[i];
        nums[i] = nums[small];
        nums[small] = temp;
    }
}

剑指 Offer 39. 数组中出现次数超过一半的数字