📅  最后修改于: 2023-12-03 15:26:09.498000             🧑  作者: Mango
给定一个由整数组成的非空数组,其中有一个元素出现次数超过一半。找到这个元素并返回。
使用哈希表记录每个数字出现的次数,遍历数组并更新哈希表。最后遍历哈希表找到出现次数超过一半的数字。
时间复杂度:$O(n)$
空间复杂度:$O(n)$
def majorityElement(nums: List[int]) -> int:
counter = {}
for num in nums:
if num not in counter:
counter[num] = 1
else:
counter[num] += 1
if counter[num] > len(nums) / 2:
return num
排序数组后,中间的数字一定是出现次数超过一半的数字。
时间复杂度:$O(n log n)$
空间复杂度:$O(log n)$(排序所需的空间)
def majorityElement(nums: List[int]) -> int:
nums.sort()
return nums[len(nums) // 2]
维护一个候选数字和计数器,遍历数组时如果当前数字等于候选数字则计数器加一,否则计数器减一。如果计数器为零,则更新候选数字为当前数字,重新开始计数。由于要查找出现次数超过一半的数字,所以确保有这样一个数字的存在。
时间复杂度:$O(n)$
空间复杂度:$O(1)$
def majorityElement(nums: List[int]) -> int:
candidate = None
count = 0
for num in nums:
if count == 0:
candidate = num
count += 1 if num == candidate else -1
return candidate
本文介绍了三种方法解决寻找出现次数超过一半的数字的问题,包括哈希表、排序和摩尔投票法。其中,摩尔投票法是最佳的解决方案,具有 $O(n)$ 的时间复杂度和 $O(1)$ 的空间复杂度。