(JAVA)LeetCode 169 多数元素

这篇博客探讨了如何在给定数组中找到多数元素,即出现次数超过数组长度一半的元素。介绍了三种解法:排序、HashMap统计和摩尔投票法。排序法虽然直观但效率较低,HashMap法在O(n)时间内完成但空间复杂度较高,而摩尔投票法则能在O(n)时间复杂度内使用常数空间解决,表现最优。
摘要由CSDN通过智能技术生成

题目描述

给定一个大小为 n 的数组,找到其中的多数元素。
多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

在这里插入图片描述

解法一:排序

  • 最简单,由题目描述可知,多数元素为出现次数大于n/2,那么排序后数组中间的数一定为多数元素
  • 如果使用语言自带的排序算法,需要使用 O(logn) 的栈空间。如果自己编写堆排序,则只需要使用 O(1) 的额外空间。
  • 时间复杂度为排序时间复杂度,性能较差,对比排序算法的时间复杂度至少为O(nlogn)
	public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        return nums[nums.length/2];
    }

解法二:HashMap

  • 遍历过程中统计每个数字出现的个数即可。
  • 可以确定的是,超过半数的数字一定有且只有一个。在计数过程中如果出现了超过半数的数字,直接返回即可
  • 时间复杂度为O(n),空间复杂度为O(n) 性能扔较差
    public int majorityElement(int[] nums) {
        HashMap<Integer,Integer> map = new HashMap<>();
        int n = nums.length;
        for(int i = 0;i<nums.length;i++){
            int before = map.getOrDefault(nums[i],0);
            if(before==n/2){
                return nums[i];
            }
            map.put(nums[i],before+1);
        }
        return -1;
    }

解法三:摩尔投票法

  • 观察代码 简单理解为正反相抵消,最终一定为count>0,且flag存储值为众数
  • 时间复杂度O(n),空间复杂度O(1)
  • 牛逼
    public int majorityElement(int[] nums) {
        int count = 0;
        int flag = 0;
        for(int i=0;i<nums.length;i++){
            if(count == 0 ){
                flag = nums[i];
            }
            count += (nums[i] == flag)?1:-1;
        }
        return flag;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值