1.1 数组和链表:169.Majority Element (Leetcode)

一道经典的面试题,找出数组中出现半数以上的元素(不包含半数)。

先贴代码:

public int majorityElement(int[] nums) {
        int result = 0,count = 0;
        for(int i = 0;i < nums.length;i ++){
            if(count == 0){
                result = nums[i];
                count ++;
            }else if(result == nums[i])
                count++;//因为相等,所以不用标记删除
            else
                count --;//将遍历到的数与前一个等于result的数标记删除
        }
        return result;
        
    }
遇到此题最先想到的还是维护一个Map集合存入数组元素出现的次数。但这种解法空间复杂度较高,而且map的put和get等操作也并不花费常数时间。

以上解题方法是基于这种思想:将数组中任意两两不相等的数删除之后得到的新数组中数量过半的元素仍然不会变。由于数组的删除操作花费较多时间,可以用懒惰删除法,即认为它已经被删除。count来记录某元素出现次数,若count==0,则认为在删除过程中最大元素的候选人已经被尽数删除,此时重新给result赋值,遍历数组完毕后,仍然留下的数(因为题上表明过半元素肯定存在)即为所求元素

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值