- 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出现的次数即可。
说一下对这个算法的理解:感觉就是让不同的数字遇见时同归于尽,如果有超过半数的数字存在,活到最后的一定是它。哈哈哈。