【数组相关】169. 多数元素

原题链接:https://leetcode-cn.com/problems/majority-element/



此题需要我们找的就是数组中出现次数大于数组长度一半的数字,并且保证该数字一定存在

如何找出来的,有些想法是将数组进过排序后,查找连续相等最长的那个数字即可

比如数组[2,2,1,1,1,2,2]经过排序后得到[1,1,1,2,2,2,2],那么接下来只需要遍历判断那个数字连续相等最长即可

但是此处我们不按照这个思路来写,因为可以发现的是,一个排序的算法时间复杂度就已经够高了,还要在遍历一遍数组,时间复杂度绝对大于O(n)

那么如何去做呢?既然题中已经保证了这个数字的存在性,那么我们假设一个场景,魏蜀吴三国士兵打擂台

蜀国士兵7人,魏国士兵3人,吴国士兵2人

我们可以先随机让一个士兵上擂台,比如魏国士兵

它是第1个上台的,那就让他先站着,然后随机再上来第2个士兵,比如蜀国士兵,把他干下去了

接着第3个士兵,也是蜀国的,那就这俩人都在这站着

第4个士兵,吴国的上台,他只能干掉一个蜀国的,然后自己也被另一个蜀国的干掉了,此时擂台还剩一个蜀国的

第5个士兵,魏国的上台,干掉蜀国的

第6个士兵,魏国的上台,那就接着站那

第7个士兵,最后一个吴国的上台,他只能干掉一个魏国的,自己也就B了

第8个士兵,蜀国的上台,干掉最后一个魏国的

接着就不用说了吧,蜀国的不能干蜀国的,那么最终在擂台上剩的是谁,谁就是我们需要的那个多数元素

总结一下

  • 先上来一个士兵,计数1
  • 之后上来的士兵如果和已在擂台上的士兵国籍相等,计数+1
  • 之后上来的士兵如果和已在擂台上的士兵国籍不等,计数-1,如果计数变为0,则后者留在擂台并重新计数为1

按照上述流程和条件,最终擂台上所剩的士兵是哪个国籍,那么这个国籍就是我们的多数元素,应该明白了吧

那么用数字表示国籍的话,是不是很简单了?来看代码吧

class Solution {
    public int majorityElement(int[] nums) {
        int number=nums[0];
        int count=1;
        for(int i=1;i<nums.length;i++){
            if(nums[i]==number){
        	count++;
           }else{
        	count--;
        	if(count==0){
        		number=nums[i];
        		count=1;
        	}
            }
        }
        return number;
    }
}

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值