# 随机法(超时看运气)
class Solution:
def majorityElement(self, nums: List[int]) -> int:
target = len(nums) // 2
while True:
ans = random.choice(nums)
if sum(1 for i in nums if i == target) > target:
return ans
方法二:字典
思路:我们建立一个空字典,对数组 nums 进行迭代,如果键存在,对应的值 +1 。
# 字典
class Solution:
def majorityElement(self, nums: List[int]) -> int:
dict_element = {}
n = len(nums)
for i in range(n):
if nums[i] in dict_element:
dict_element[nums[i]] += 1
if dict_element[nums[i]] > (n / 2):
return nums[i]
else:
dict_element[nums[i]] = 1
if dict_element[nums[i]] > (n / 2):
return nums[i]
# 分治
class Solution:
def majorityElement(self, nums: List[int]) -> int:
def majority_element_rec(lo, hi):
if lo == hi:
return nums[lo]
mid = (hi - lo) // 2 + lo
left = majority_element_rec(lo, mid)
right = majority_element_rec(mid + 1, hi)
if left == right:
return left
left_count = sum(1 for i in range(lo, hi + 1) if nums[i] == left)
right_count = sum(1 for i in range(lo, hi + 1) if nums[i] == right)
return left if left_count > right_count else right
return majority_element_rec(0, len(nums) - 1)
# Boyer-Moore 投票算法
class Solution:
def majorityElement(self, nums: List[int]) -> int:
count = 0
ans = None
for i in nums:
if count == 0:
ans = i
if i == ans:
count += 1
else:
count -= 1
return ans