【查找多数元素】

题目

给定一个大小为n的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于n/2的元素。假设数组是非空的,并且给定的数组总是存在多数元素。
示例:
输入:[3,2,3]
输出:3

解法一:map

public static int most_occurrences1(int[] nums){
        Map<Integer,Integer> map = new HashMap<>();
        int halflen = nums.length/2;
        for (int i = 0; i < nums.length; i++) {
            int num = nums[i];
            int count =1;
            if (map.containsKey(num)){
                count=map.get(num);
                count++;
            }
            if (count > halflen){return num;}

            map.put(num,count);//同样的key,不同的value会覆盖。

        }
        return -1;

    }

时间复杂度:O(n);
空间复杂度:O(n).

解法二:投票算法

思路:把第一个元素当做候选元素(可能的多数元素),设置count计数候选元素个数。当下一个元素等于候选元素时,count++;当下一个元素不等于候选元素时,count–。当count == 0时,更换候选元素。

public static int most_occurrences2(int[] nums){

        int candidate =-1;
        int count =0;

        for (int i = 0; i < nums.length; i++) {
            if (count==0){candidate=nums[i];}
            if (candidate==nums[i]){count++;}
            else {count--;}

        }
        return candidate;
    }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值