算法题,水王数的处理(python版)

Posted 韶光不负

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法题,水王数的处理(python版)相关的知识,希望对你有一定的参考价值。

不及小步无以至千里,所以想要增强自己,只有不断练习。如果小编的文章对你有帮助,不要忘了关注加点赞哦!

目录

 

什么是水王数?

有什么用?

解体思路!

完整代码:


什么是水王数?

水王数:在一个列表当中出现次数超过总次数一半的数。

有什么用?

比如说美国的选举投票,总统想要一半以上的票,不然就重新进行选择投票。

解体思路!

题型:给定一个数列,请求出出现次数大于一半以上的数?要求:时间复杂度O(n),额外空间复杂度O(1)

1,首先我们需要2个变量,一个存储候选人(voters)一个统计候选人消除出现次数(hp)

2,逻辑思路:候选人出现次数大于所以其他数的总和,遍历数组,选取第一个个数为候选人,给定消除次数为1,当下一个数与候选人相同加1,(不同减1,并让下一个数当候选人),如此反复遍历到末尾的数,

#代码实现
 for num in ls:
        if hp == 0:#消除数后次数为0,创建候选
            voters = num
            hp = 1  #给它出现次数
        elif voters != num: #如果数值与候选不一样-1
            hp -= 1
        else:#反之,相同加一
            hp += 1

(有一种特殊情况,类似(1,2,3,4,5)用上面逻辑水王数就为5,但实际情况并不是,所以需要一个变量来统计一下候选人出现次数,当出现次数大于数组一半以上时,就确定是水王数)

#代码实现
 cont = 0  # 出现次数
    for i in ls:
        if i==voters:
            cont+=1
    if cont>=len(ls)/2:
        return voters
    else:
        return -1

完整代码:

'''
水王数的解决
作者:ls富
time:2021/6/4
'''
def witer_num(ls):
    if len(ls)==0:
        return -1
    voters=0 #候选
    hp=0 #出现消除后次数
    for num in ls:
        if hp == 0:#消除数后次数为0,创建候选
            voters = num
            hp = 1  #给它出现次数
        elif voters != num: #如果数值与候选不一样-1
            hp -= 1
        else:#反之,相同加一
            hp += 1
    # 如果遍历完成后,没有候选
    if hp == 0:
        return -1
    #有候选情况
    cont = 0  # 出现次数
    for i in ls:
        if i==voters:
            cont+=1
    if cont>=len(ls)/2:
        return voters
    else:
        return -1
if __name__ == '__main__':
    ls=[3,2,3,3,3,4,5]
    print(witer_num(ls))

 

以上是关于算法题,水王数的处理(python版)的主要内容,如果未能解决你的问题,请参考以下文章

左神讲算法——超级水王问题(详解)

左神讲算法——超级水王问题(详解)

算法一 超级水王问题

找水王

力扣算法题-Python1两数的和

力扣刷题算法笔记(javascript版)