【LeetCode】169. 多数元素


 

 解题思路:

一)哈希

既然总存在多数元素,也就是目标元素个数总大于总元素的一半,那么可以用哈希表遍历数组,将每个数存进去,同时计算相同元素的个数,如果有元素的个数大于总数一半,返回该元素

        lt = {}        
        for i in range(len(nums)):
            lt[nums[i]] = lt.get(nums[i],0)+1    #将每个元素加入并计算个数
            if lt[nums[i]] > len(nums)/2:
                return nums[i]

二)排序计算

由于多数元素占比超过一半,那么排序后中间的元素必定是多数元素,返回

        nums.sort()
        return nums[len(nums)//2]

三)摩尔投票

这种方法很有意思,我也刚接触。简单来说就是从多个数选出一个个数最多的,思想就是元素两两对比,若不同将他俩过滤掉,相同的话保存,最后剩下的就都是相同的数,也就是多数。

设置初始flag标识为0,计数器为零,先保存第一个数对比,往后遍历列表元素,若相同就将计数器加一表示该种数据个数,不同就将计数器减一,当计数器为零时说明该元素库存没有了,那就把下一个将要遍历的元素当做保存元素接着对比,循环,最后保存元素就是要返回的元素。本题中多数元素占比过半,最差就是保存元素就剩下一个

 下图为本人对其理解,清空并不是真正清空而是要换了对象

        temp = 0         #保存元素
        count = 0        #计数器
        for i in range(len(nums)):    #遍历列表
            if count == 0:    
                temp = nums[i]        #确定保存元素
                count += 1 
            elif nums[i] == temp:    #相等个数加一
                count += 1
            else:
                count -= 1        #否则减一
        return temp    #最后的保存元素
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

onlywishes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值