【leetcode】哈希表 & 摩尔投票

该博客介绍了两种解决LeetCode问题17.10的方法:用哈希表和摩尔投票法寻找数组中的主要元素,即出现次数超过数组长度一半的元素。哈希表方案通过遍历数组统计每个元素出现次数,当某元素计数超过一半时返回。摩尔投票法则在遍历过程中淘汰票数较少的元素,最后的元素可能是主要元素,再遍历一次确认其出现次数。这两种方法都用于处理可能存在多数元素的情况。
摘要由CSDN通过智能技术生成

面试题 17.10. 主要元素

解1:

【用哈希表】

class Solution {
    public int majorityElement(int[] nums) {
        int n=nums.length;
        Map<Integer,Integer> map=new HashMap<>();
        for(int i=0;i<nums.length;i++){
            map.put(nums[i],map.getOrDefault(nums[i],0)+1);
            if(map.get(nums[i])>n/2) return nums[i];
        }
        return -1;
    }
}

解2:

【摩尔投票】

参考:
链接:https://leetcode-cn.com/problems/find-majority-element-lcci/solution/gong-shui-san-xie-yi-ti-shuang-jie-ha-xi-zkht/

在集合中寻找可能存在的多数元素,这一元素在输入的序列重复出现并占到了序列元素的一半以上;在第一遍遍历之后应该再进行一个遍历以统计第一次算法遍历的结果出现次数,确定其是否为众数;如果一个序列中没有占到多数的元素,那么第一次的结果就可能是无效的随机元素。

class Solution {
    public int majorityElement(int[] nums) {
        int n=nums.length;
        int cnt=0;
        int x=-1;
        for(int i:nums){
            if(cnt==0){
                x=i;
                cnt=1;
            }
            else{
                cnt+=x==i?1:-1;
            }
        }
        cnt=0;
        for(int i:nums){
            if(i==x) cnt+=1; 
        }
        return cnt>n/2?x:-1;

    }
}

再进行一次遍历的原因:检查这个「可能」的主要元素 xx 的出现次数是否超过总数一半
防止类似 【1,1,2,2,3】这样的情况出现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值