【LeetCode14】求众数

640?wx_fmt=png

? 温故而知新

? 今日挑战

给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在众数。

示例 1:

输入: [3,2,3]输出: 3

示例 2:

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

先思考一下,后面我会给出一个解题思路~?

640?wx_fmt=other

图来自网络

Way 1

第一种方法最直接,直接使用Python的库collections里的方法Counter,直接统计所有元素出现的次数,返回最大次数的元素即可。

Python实现:

def majorityElement(nums):
    counts = collections.Counter(nums)
    print(counts)
    return max(counts.keys(), key=counts.get)

Way 2

第二种方法这里介绍一下Boyer-Moore 投票算法。

1 )因为题目中对于众数的定义为出现次数大于 ⌊ n/2 ⌋ 的元素 ,因此我们把众数记为 +1,把其他数记为 -1,将它们全部加起来,显然和大于 0 。

2 )这里,我们把第一次出现的数字,当做为当前的候选者,循环迭代,如果出现不一样的数字,投票器减1,出现相同的数字,投票器加1,如果投票器为0,重新挑选当前位置的数字作为新的候选者,从当前的位置开始,继续迭代。

可以看下面的例子:

[7, 7, 5, 7, 5, 1 | 5, 7 | 5, 5, 7, 7 | 7, 7, 7, 7]

首先,下标为 0 的 7 被当做众数的第一个候选。在下标为 5 处,计数器会变回0 。所以下标为 6 的 5 是下一个众数的候选者。由于这个例子中 7 是真正的众数,所以通过忽略掉前面的数字,我们忽略掉了同样多数目的众数和非众数。因此, 7 仍然是剩下数字中的众数。

[7, 7, 5, 7, 5, 1 | 5, 7 | 5, 5, 7, 7 | 5, 5, 5, 5]

现在,众数是 5 (在计数器归零的时候我们把候选从 7 变成了 5)。此时,我们的候选者并不是真正的众数,但是我们在 遗忘 前面的数字的时候,要去掉相同数目的众数和非众数(如果遗忘更多的非众数,会导致计数器变成负数)。

因此,上面的过程说明了我们可以放心地遗忘前面的数字,并继续求解剩下数字中的众数。最后,总有一个后缀满足计数器是大于 0 的,此时这个后缀的众数就是整个数组的众数。

Python实现:

def Moore(nums):
    count=0
    target=None
    for i in range(len(nums)):
        print(i)
        print(target)
        if target==None or count==0: 
            target=nums[i]
            count+=1
        else:
            if target == nums[i]: count+=1
            else: count-=1
    return target

? 配图角色背景介绍

绯红女巫(Scarlet Witch)是美国漫威漫画旗下超级英雄,初次登场于《X战警》(The X-Men)第4期(1964年3月),由编剧斯坦·李和画家杰克·科比联合创造。本名旺达·姜戈·马克西莫夫(Wanda Django Maximoff),她的起源故事版本众多,漫画中最新剧情是由吉普赛人姜戈和玛丽所生,小时候和双胞胎弟弟快银(比绯红女巫晚出生30秒)一起被高进化者(High Evolutionary)绑架当做实验对象,从而获得了混沌魔法(创造和湮灭物质)和修改概率的能力,后来二人被骗,听信了自己是万磁王的孩子,母亲抛弃了他们,接生的牛头女士把他们交给了吉普赛人夫妇的这个说法。还和弟弟共同加入万磁王领导的变种人兄弟会。后得知真相改邪归正,加入复仇者联盟。并且遇到了同为复仇者成员的幻视,于是两人坠入爱河结为夫妻

原著中的绯红女巫跟快银一样也是十分强大的存在,但是由于她是变种人超能力不受控,曾经由于超能力时空使得复仇者联盟分崩离析,更是差点将变种人灭绝。不过复仇者系列电影中的绯红女巫还未成长到那种地步,仅仅是初出茅庐的小姑凉,但是具导演坦然如果在电影中把绯红女巫的实力展现出来,那么《美国队长3:内战》就可以不用拍了,全场被女巫一个秒杀。而且在电影中虽然绯红女巫的力量来源于心灵宝石,但是就连幻视都是被她完虐的份,虽然这存在着部分感情因素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值