229. Majority Element II

本文介绍了一种名为Boyer-Moore的算法,该算法可在O(n)时间复杂度和O(1)空间复杂度下找出数列中出现次数超过1/3数列长度的值。通过巧妙地让不同数字相遇时相互抵消,最终找到majority元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. Majority Element II
    找出数列中出现次数大于1/3数列长度的值。
    如果用字典当然可以计算,但是题目要求空间复杂度O(1)

如何不使用额外空间计算数列中值的出现次数呢?
这里用到的方法叫做Boyer-Moore Algorithm添加链接描述,是一种非常巧妙的统计majority的算法,具有O(n)的时间复杂度和O(1)的空间复杂度。

1,定义majority为出现次数超过一半的值。用boyter-moore如何寻找一个数列中的majority?
初始化变量candidate=0,count=0

for x in nums:
    if count==0:则candidate=x,count=1
    elif count>0:
        if x==candidate:count+=1
        if x!=candidate:count-=1

如果数组中存在majority,则最后一定会保存在candidate中。
如果不确定是否存在majority,则再次遍历数组,数一下candidate出现的次数即可。

2,接下来将算法稍加变化,解决本题,即出现次数超过1/3的值。
初始化candi1=0, candi2=0, count1=0, count2=0

for x in nums:
    if count1=0: candi1=x, count1+=1
    elif count2=0: candi2=x, count2+=1
    else:
        if candi1 == x: count1+=1
        elif candi2 == x: count2+=1
        else: count1-=1, count2-=1

如果数组中存在majority,则最后一定会保存在candidate中。
如果不确定是否存在majority,则再次遍历数组,数一下candidate出现的次数即可。

说一下对这个算法的理解:感觉就是让不同的数字遇见时同归于尽,如果有超过半数的数字存在,活到最后的一定是它。哈哈哈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值