1、散列表
class Solution:
def majorityElement(self, nums: List[int]) -> int:
# 字典存储 时间O(n) 最差空间O(n)
dic = defaultdict(int)
for num in nums:
dic[num] = dic[num]+1
# 返回value值最大的
return max(dic,key=dic.get)
简化:
class Solution:
def majorityElement(self, nums: List[int]) -> int:
counts = collections.Counter(nums)
return max(counts.keys(), key=counts.get)
2、排序
class Solution:
def majorityElement(self, nums: List[int]) -> int:
# 排序,找出存在大于n/2的数 空间复杂度O(1)
nums.sort()
size = len(nums)
for i in range(size):
if nums[i] == nums[i+size//2]:
return nums[i]
3、摩尔投票
class Solution:
def majorityElement(self, nums: List[int]) -> int:
# 摩尔投票法 相当于擂台轮守,如果票数过半,一定是最后守擂的
major = 0
count = 0
for num in nums:
if count == 0: # 当前擂台无人
major = num
count += 1
elif major == num: # 擂台上的人得票
count += 1
else: # 非擂台上的人得票
count -= 1
return major
4、动态规划 (学习一下,通用算法)
class Solution:
def majorityElement(self, nums: List[int]) -> int:
# 动态规划法 每次分为两部分,求当前部分的多数元素 时间复杂度O(nlogn)
def dpmajority(le,ri):
if le == ri:
return nums[le]
mid = le + (ri-le)//2
left = dpmajority(le,mid)
right = dpmajority(mid+1,ri)
if left == right:
return left
left_count = sum(1 for i in range(le,ri+1) if nums[i]==left)
right_count = sum(1 for i in range(le,ri+1) if nums[i]==right)
return left if left_count > right_count else right
return dpmajority(0, len(nums)-1)