介绍三种时间复杂度和空间复杂度不同的解法。
# -*- coding:utf-8 -*-
class Solution:
def MoreThanHalfNum_Solution(self, numbers):
# write code here
# 一、哈希表计数
# 时间复杂度:O(n),空间复杂度:O(n)
num_map = {}
for i in set(numbers):
num_map[i] = 0
for i in numbers:
num_map[i] += 1
n = len(numbers)
for key in num_map:
if num_map[key] > n/2:
return key
return 0
# 二、快速排序,计算中位数
# 时间复杂度:O(NlogN)空间复杂度:O(1)
def quick_sort(nums,left,right):
if left >= right:
return
index1,index2 = left,right
key = nums[left]
while left < right:
while left < right and nums[right] >=key:
right -= 1
nums[left] = nums[right]
while left < right and nums[left] < key:
left += 1
nums[right] = nums[left]
nums[left] = key
quick_sort(nums,index1,left)
quick_sort(nums,left+1,index2)
if len(numbers) < 1:
return 0
left = 0
right = len(numbers)-1
quick_sort(numbers,left,right)
# 判断中位数是否符合条件
target = numbers[(right+1)/2]
count = 0
for num in numbers:
if target == num:
count += 1
return target if count > len(numbers)/2 else 0
# 三、比较次数,如果有符合条件的数字,则它出现的次数比其他所有数字出现的次数和还要多。
# 时间复杂度:O(n),空间复杂度:O(1)
if len(numbers) < 0:
return 0
result = numbers[0]
times = 1
for i in range(1,len(numbers)):
if result == numbers[i]:
times += 1
else:
if times:
times -= 1
else:
result = numbers[i]
times = 1
# 判断result是否满足条件
times = 0
for num in numbers:
if result == num:
times += 1
return result if times > len(numbers)/2 else 0