【LeetCode】229. 求众数 II


解题思路:

一)哈希

使用哈希表来计算每个数的个数,然后返回相同数的个数判断是否满足要求

        ls = []    #结果
        lt = {}    
        for i in nums:
            lt[i] = lt.get(i,0)+1        #计数
        for i,j in lt.items(): 
            if lt[i] > len(nums)/3:    #判断
                ls.append(i)
        return ls

二)摩尔投票

因为要选大于总长1/3的数,那么最多存在两个数满足要求,若要选大于总长1/n的数,那么最多存在n-1个数满足要求

这里最多两个满足,设置两个变量存储遍历到的值,若遍历到的值在这两个变量中,对应计数增加1,否则都减1,若有一个数的计数为零则换一个数存储,最后剩下的是保留到最后的值,但还要计算他俩的个数并判断个数是否满足要求。

        ls = []        #保存最终结果
        temp1 = 0
        temp2 = 0         #保存元素
        count1 = 0        #计数器
        count2 = 0
        for i in range(len(nums)):    #遍历列表
            if (temp1 == nums[i]):    #遇到相同值加1,下一个
                count1 += 1
                continue
            elif (temp2 == nums[i]):
                count2 += 1
                continue
            elif count1 == 0:    
                temp1 = nums[i]        #该值库存为0换新值
                count1 += 1
                continue 
            elif count2 == 0:    
                temp2 = nums[i]
                count2 += 1
                continue
            else:
                count1 -= 1        #遇到保存的数之外的,个数都减一
                count2 -= 1

        count1 = 0    #计算个数
        count2 = 0
        for i in range(len(nums)):
            if temp1 == nums[i]:
                count1 += 1
            elif temp2 == nums[i]:
                count2 += 1
        if count1>len(nums)/3:        #将符合结果的加入最终结果
            ls.append(temp1)
        if count2>len(nums)/3:
            ls.append(temp2)
        return ls
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

onlywishes

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

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

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

打赏作者

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

抵扣说明:

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

余额充值