question:
Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋
times.
You may assume that the array is non-empty and the majority element always exist in the array.
最开始想的代码是这样的:class Solution(object):
def majorityElement(self, nums):
n = len(nums)/2
a={}
if n>0:
for i in nums:
a[i] = nums.count(i)
if a[i] > n:
return i
else:
return False
else:
return nums[0]
这个代码时间复杂度O(n2),直接导致 Time Limit Exceeded
后来上网找找了一下,发现有个库collisions,里面有个Counter可以统计列表里元素的个数,改了一下代码,之后是这样:
class Solution(object):
def majorityElement(self, nums):
n = len(nums)/2
a=collections.Counter(nums)
if n > 0:
for i in a:
if a[i]>n:
return i
else:
return nums[0]
时间是96ms,处于4.%,觉得还是太慢,上网找了一下答案,用到了
Moore Voting算法
代码如下:
class Solution(object):
def majorityElement(self, nums):
if len(nums) == 1:
return nums[0]
candidate = 0
count = 0
for i in range(len(nums)):
if count == 0:
candidate = nums[i]
count += 1
else:
if nums[i] == candidate :
count += 1
else:
count -= 1
return candidate
这个算法很巧妙,一个计数器,一开始我也没想明白,但是最好的方法就是用实际的例子推演一遍,如[2,3,3,3,7]等
因为主要元素>n/2,不管count是加1还是减1,最后只是保证在count == 0时或者nums[-1]时,candidate一定为主要元素。
这个算法的时间复杂度为O(n),空间复杂度O(1)