class Solution(object):
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
# 方法一
counts = collections.Counter(nums)
return max(counts.keys(), key=counts.get)
# 也可以使用counter的most_common()
# return counts.most_common(1)[0][0]
# 方法二、暴力循环,计数时比较巧妙,但是超时间了
mid = len(nums) // 2
for num in nums:
count = sum(1 for i in nums if i == num)
if count > mid:
return num
# 3.太巧妙了
# 先排序
nums.sort()
# 中间数一定是众数
return nums[len(nums)//2]
# 4.分治法
return self.mergesort(nums, 0, len(nums)-1)
def mergesort(self, nums, left, right):
if left == right:
return nums[left]
mid = left + ((right-left)>>1)
mergeleft = self.mergesort(nums, left, mid)
mergeright = self.mergesort(nums, mid+1, right)
if mergeleft == mergeright:
return mergeleft
countleft = countright = 0
for i in nums[left:right+1]:
if i == mergeleft:
countleft += 1
elif i == mergeright:
countright += 1
# 刚学的这种计数方法,不如上面的方法好,执行时间翻了一倍
# countleft = sum(1 for i in range(left, right+1) if nums[i] == mergeleft)
# countright = sum(1 for i in range(left, right+1) if nums[i] == mergeright)
if countleft > countright:
return mergeleft
else:
return mergeright
方法3图解