此题其实是在寻找众数,使用暴力解法,运用字典
class Solution:
def majorityElement(self, nums: List[int]) -> int:
length = len(nums)
num_mapping = {}
for n in nums:
num_mapping[n] = num_mapping.get(n, 0) + 1
for k, v in num_mapping.items():
if v > length // 2:
return k
题目中有个进阶:
进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
使用摩尔投票算法
摩尔投票算法是一种在线性时间和常数空间内寻找数组或流中的众数的算法。它的基本思想是维护一个候选众数和一个计数器,遍历数组时,如果遇到的数和当前的候选众数相同,则计数器加一;如果不同,则计数器减一。当计数器为零时,更新候选众数为当前元素。最后剩下的候选众数即为众数。
摩尔投票算法的步骤如下:
- 初始化一个候选众数 candidate 和一个计数器 count。
- 遍历数组中的每个元素 num。
- 如果 count 为零,将 candidate 更新为 num,并将 count 设置为 1。
- 如果 num 等于 candidate,将 count 加 1。
- 如果 num 不等于 candidate,将 count 减 1。
- 遍历结束后,candidate 即为众数。
需要注意的是,摩尔投票算法只能找到一个众数,如果数组中存在多个众数,该算法可能无法找到所有众数。此外,算法假设给定的数组总是存在众数。
class Solution:
def majorityElement(self, nums: List[int]) -> int:
count= 0
res = None
for n in nums:
if count == 0:
res = n
count += (1 if n == res else -1)
return res