题目:求众数
- 给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于
⌊ n/2 ⌋
的元素。 - 你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
来源:力扣(LeetCode)第169题
分析:
这道题很经典,方法有很多,暴力法,分治法,哈希法,排序法,随机法,投票法。我自己用了哈希法做出来的,但是官方的投票法真的是太秀了,这里着重讲投票法。
思路:
- 先让第一个人作为
candidate
, - 然后和它一样的元素给他加票,不一样的元素给它减票,
- 当票数为0时,就换掉
candidate
,让新的元素担任。 - 最后成为
candidate
的元素就是众数。 - 当然,前提是题目给出地假设一定存在众数。
代码:
投票法:
class Solution: def majorityElement(self, nums: List[int]) -> int: candidate = 0 count = 0 for num in nums: if count == 0: candidate = num count += 1 if num == candidate else -1 return candidate
哈希法:(自己做的)
class Solution: def majorityElement(self, nums: List[int]) -> int: cnt = len(nums) / 2 dic = {} for num in nums: if num in dic: dic[num] += 1 else: dic[num] = 1 if dic[num] >= cnt: return num
复杂度分析:
- 投票法:
- 时间复杂度:O(n)
- 空间复杂度:O(1)