📅  最后修改于: 2023-12-03 14:58:36.751000             🧑  作者: Mango
本题是门|门CS 2008的第50题。题目要求编写一个程序,对于给定的一组数列,求出其中的一个数,使得它出现的次数在数列中超过一半。
对于这一题,可以采用多种解决方案。我们这里介绍两种较为常见的算法。
摩尔投票算法(Moore's Voting Algorithm)是一种用于求解一组数中出现次数超过一半的数的经典算法。
该算法大致思路如下:
该算法可以在O(n)的时间内完成求解。
排序法是一种简单直观的求解方法,大致思路如下:
该算法的时间复杂度为O(nlogn),取决于排序算法的效率。
class Solution:
def majorityElement(self, nums: List[int]) -> int:
candidate = nums[0] # 初始化候选数
count = 1 # 初始化票数
for i in range(1, len(nums)):
if nums[i] == candidate:
count += 1
else:
count -= 1
if count == 0:
candidate = nums[i]
count = 1
return candidate
class Solution:
def majorityElement(self, nums: List[int]) -> int:
nums.sort() # 排序
return nums[len(nums)//2] # 返回中间数
本题介绍了求解一组数中出现次数超过一半的数的两种算法——摩尔投票算法和排序法。摩尔投票算法效率更高,但实现稍微复杂一些;排序法则代码简洁,但时间复杂度较高。在实际解决问题时,需要根据具体情况选择合适的算法。