数组中出现超过数组长度一半的数字

博客探讨了如何找出数组中出现次数超过数组长度一半的数字。提供了两种方法:一是使用哈希法,通过HashMap记录元素及其出现次数,判断是否超过一半;二是通过排序数组,中间元素即为众数。时间复杂度分别为O(n)和O(nlogn)。

数组中出现超过数组长度一半的数字

        题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

        思路一:哈希法。我们可以创建一个HashMap。其中键为数组中的元素,其对应的值为该元素在数组中出现的次数。

        时间复杂度:O(n)。 空间复杂度:O(n)

        当我们将数组中的某个元素放入HashMap中,首先判断它是不是在HashMap中已经存在,如果存在,得到其对应的value,并加1(因为value对应的是该元素在数组中出现的次数)。如果不存在,则将该元素作为HashMap中的key存入map集合,并将其对应的value设置为1(因为该元素第一次添加到map集合中,所以value设置为1)。当我们某个元素已经存在于map集合中,我们拿到其对应的value,然后判断该value是否大于数组长度的一半。如果是,则直接return该key。

        特殊地,如果数组长度为1,我们需要对这种情况单独做一个判断。

        代码实现

public static int majorityElement(int[] nums) {
        Map<Integer,Integer> map = new HashMap<>();
        for(int i = 0;i<nums.length;i++){
            if(map.containsKey(nums[i])){
                map.put(nums[i],map.get(nums[i])+1);
                if (map.get(nums[i])> nums.length>>1){
                    return nums[i];
                }
            }else{
                map.put(nums[i],1);
            }
        }
        if (nums.length == 1) return nums[0];
// 如果没有出现次数超过数组一半长度的元素,则返回-9999
        return -9999;
    }

        思路二:将数组排序,则数组中间的元素,一定是众数。

        时间复杂度:O(nlogn),空间复杂度:O(1)

        代码实现

    public static int majorityElement2(int[] nums){
        Arrays.sort(nums);
        return nums[nums.length/2];
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值