169. 多数元素

#169. 多数元素

题目难度:简单

解题方法

    • #169. 多数元素
    • ***1、摩尔投票法***
    • ***2、简单计数Hashmap***
    • ***3、排序***
    • ***4、改进快排O(n)***

题目描述
169. 多数元素_第1张图片
解题思路

1、摩尔投票法

新知识点!
169. 多数元素_第2张图片

public int majorityElement(int[] nums) {
  	int count = 1,re = nums[0];  //从第一个数开始,计数1次
  	for (int i = 1; i < nums.length-1; i++) {
   		if(nums[i] == re)
    		count++;
   		else count--;
   		if(count == 0) re = nums[i+1];
  	}
 	 return re;
    }

提交结果:时间复杂度O(n),空间复杂度O(1)
169. 多数元素_第3张图片

2、简单计数Hashmap

public int majorityElement1(int[] nums) {
   	Map<Integer, Integer> counter = new HashMap<>();
       // 遍历每个数统计次数
   	for(int num:nums) {
    		counter.put(num,counter.getOrDefault(num, 0) + 1);
    		if(counter.get(num) > nums.length/2)
     			return num;
   		}
   	return -1;
 }

提交结果:
时间复杂度和空间复杂度都是O(n)
169. 多数元素_第4张图片

3、排序

可以直接对整个数组进行排序,大于n/2的元素一定就出现在n/2的位置
简单不费脑细胞

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

4、改进快排O(n)

题解里面学到的方法,很绝!
本题可以理解成求第n/2+1小的数,典型的求第K大/第K小问题
直接快排O(N)找第K大/第K小即可。雷同问题相同解法可以看看
215. 数组中的第K个最大元素,

public int majorityElement(int[] nums) {
        return quickSearch(nums, 0, nums.length - 1, nums.length / 2);
    }
private int quickSearch(int[] nums, int lo, int hi, int k) {
        // 每快排切分1次,找到排序后下标为j的元素,如果j恰好等于n/2就返回;
        int j = partition(nums, lo, hi);
        if (j == k) {
            return nums[j];
        }
        // 否则根据下标j与k的大小关系来决定继续切分左段还是右段。
        return j > k? quickSearch(nums, lo, j - 1, k): quickSearch(nums, j + 1, hi, k);
    }
    // 快排切分,返回下标j,使得比nums[j]小的数都在j的左边,比nums[j]大的数都在j的右边。
    private int partition(int[] nums, int lo, int hi) {
        int v = nums[lo];
        int i = lo, j = hi + 1;
        while (true) {
            while (++i <= hi && nums[i] < v);
            while (--j >= lo && nums[j] > v);
            if (i >= j) {
                break;
            }
            int t = nums[j];
            nums[j] = nums[i];
            nums[i] = t;
        }
        nums[lo] = nums[j];
        nums[j] = v;
        return j;
    }

169. 多数元素_第5张图片
提交结果:
169. 多数元素_第6张图片

你可能感兴趣的:(力扣刷题笔记)