摩尔投票法的基本思想很简单,在每一轮投票过程中,从数组中找出一对不同的元素,将其从数组中删除。这样不断的删除直到无法再进行投票,如果数组为空,则没有任何元素出现的次数超过该数组长度的一半。如果只存在一种元素,那么这个元素则可能为目标元素。
想一想也好理解,如果数组中有个元素个数多于一半,那么只要找到一个和它不同的就减去一个,那么和它不同的元素个数必然是小于它的个数,那么最后全部找完后剩下的元素就是要找的元素。
例如现在数组为 [ 1 , 2 , 1 , 3 , 1 , 1 , 1 , 2 ] [1,2,1,3,1,1,1,2] [1,2,1,3,1,1,1,2],设置数组Res用于存放可能是结果的元素,使用Count来记录Res中当前元素剩下的个数,依次遍历数组:
-
如果
Count == 0,那么说明Res为空,则将当前元素放入Res -
如果
Count != 0,且当前元素和Res中元素相同,则执行Count +=1 -
如果如果
Count != 0,且当前元素和Res中元素不同,则执行Count -= 1 -
最后如果
Res不为空,则Res中的元素就要找的结果
实现代码:
class Solution(object):
def majorityElement(self, nums):
Res = 0
count = 0
for n in nums:
if count == 0:
major = n
if n == major:
count = count + 1
else:
count = count - 1
return major