博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
边工作边刷题:70天一遍leetcode: day 62
阅读量:5044 次
发布时间:2019-06-12

本文共 1141 字,大约阅读时间需要 3 分钟。

Majority Element II

要点:无论是1个majority,2个majority还是k个,都是三种情况:count+1,all count-1,情况变化发生在0(初始或者减到0)。重要的是三种情况的验证顺序:首先cand已经存在,那么对应count+1,else:检查0,初始化,else:所有count--

这个算法的假设是如果有个数>n/k次存在,那么其他元素offset最多n/k次。所以增加只是对一个count,而减少对所有count。另外,当count-1到0的时候,并不是在同一个循环内reset,而是到下一个元素。因为2个元素势均力敌,并不应该立刻选第2个。当然这样如果不存在majority会有false positive,比如[2,2,2,3,4,5], k=1,2是不符合条件的。所以要最后再check一遍
错误点

  • cand1和cand2初始值:用0和1,仅仅是为了让二者不同(否则有可能结果包括2次),因为最后有一轮额外check,所以不用担心值不符合条件
  • / vs //: //是integer division而/是float division

class Solution(object):    def majorityElement(self, nums):        """        :type nums: List[int]        :rtype: List[int]        """        cand1, cand2 = 0,1        count1, count2=0,0        for i in nums:            if cand1==i:                count1+=1            elif cand2==i:                count2+=1            elif count1==0:                cand1=i                count1=1            elif count2==0:                cand2=i                count2=1            else:                count1-=1                count2-=1        return [n for n in [cand1, cand2] if nums.count(n)>len(nums)//3]

转载于:https://www.cnblogs.com/absolute/p/5690342.html

你可能感兴趣的文章
Requests库的基本使用
查看>>
C#:System.Array简单使用
查看>>
C#inSSIDer强大的wifi无线热点信号扫描器源码
查看>>
「Foundation」集合
查看>>
算法时间复杂度
查看>>
二叉树的遍历 - 数据结构和算法46
查看>>
类模板 - C++快速入门45
查看>>
centos7 搭建vsftp服务器
查看>>
RijndaelManaged 加密
查看>>
Android 音量调节
查看>>
HTML&CSS基础学习笔记1.28-给网页添加一个css样式
查看>>
windows上面链接使用linux上面的docker daemon
查看>>
Redis事务
查看>>
Web框架和Django基础
查看>>
python中的逻辑操作符
查看>>
CSS兼容性常见问题总结
查看>>
HDU 1548 A strange lift (Dijkstra)
查看>>
每天一个小程序—0005题(批量处理图片大小)
查看>>
C# 启动进程和杀死进程
查看>>
tcp实现交互
查看>>