力扣面试题 17.10. 主要元素

该博客讨论了如何在给定整数数组中找到主要元素,即出现次数超过数组长度一半的元素。提出了两种方法:一是使用哈希表统计每个元素出现次数,二是应用摩尔投票算法。哈希表方法在找到可能的主要元素后需再次遍历验证;摩尔投票法通过抵消不同元素,最后可能存在的元素可能是主要元素,但也需二次验证。两种方法都满足O(N)时间复杂度和O(1)空间复杂度的要求。
摘要由CSDN通过智能技术生成

数组中占比超过一半的元素称之为主要元素。给你一个 整数 数组,找出其中的主要元素。若没有,返回 -1 。请设计时间复杂度为 O(N) 、空间复杂度为 O(1) 的解决方案。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-majority-element-lcci

输入:[1,2,5,9,5,9,5,5,5]
输出:5

法一:hash统计

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

法二:摩尔投票

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

每次将两个不同的元素进行「抵消」,如果最后有元素剩余,则「可能」为元素个数大于总数一半的那个。
为什么说是可能呢,因为抵消到最后,可能会有捡漏情况存在,出现在最后,只出现一次却成功的留到了最后。
因此需要再进行一次遍历,检查这个「可能」的主要元素 xx 的出现次数是否超过总数一半。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值