您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# LeetCode如何求众数
## 什么是众数
众数(Mode)是统计学中的概念,指在一组数据中出现次数最多的数值。与平均数、中位数不同,众数反映的是数据的集中趋势中最常见的值。例如:
- 数据集 `[1, 2, 2, 3]` 的众数是 `2`
- 数据集 `[1, 1, 2, 2]` 的众数是 `1` 和 `2`(多众数情况)
在LeetCode中,典型的众数问题如 **169. Majority Element**(多数元素),要求找出出现次数超过 `⌊n/2⌋` 次的元素。
---
## 常见解法与代码实现
### 方法一:哈希表统计法
**核心思想**:通过哈希表记录每个元素的出现次数,最后返回出现次数最多的元素。
```python
def majorityElement(nums):
counts = {}
for num in nums:
counts[num] = counts.get(num, 0) + 1
return max(counts.keys(), key=counts.get)
复杂度分析: - 时间复杂度:O(n),遍历数组一次 - 空间复杂度:O(n),最坏情况下需要存储所有元素
核心思想:排序后,众数一定会出现在数组中间位置(仅适用于多数元素问题)。
def majorityElement(nums):
nums.sort()
return nums[len(nums)//2]
复杂度分析: - 时间复杂度:O(n log n),取决于排序算法 - 空间复杂度:O(1) 或 O(n),视排序实现而定
最优解:适用于出现次数超过一半的众数问题。通过抵消不同元素的方式找到候选众数。
def majorityElement(nums):
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)
要求:找出所有出现次数超过 ⌊n/3⌋
次的元素。
解法:扩展摩尔投票法,维护两个候选数。
def majorityElement(nums):
candidate1, candidate2 = None, None
count1, count2 = 0, 0
for num in nums:
if num == candidate1:
count1 += 1
elif num == candidate2:
count2 += 1
elif count1 == 0:
candidate1 = num
count1 = 1
elif count2 == 0:
candidate2 = num
count2 = 1
else:
count1 -= 1
count2 -= 1
# 二次验证
result = []
for candidate in [candidate1, candidate2]:
if nums.count(candidate) > len(nums) // 3:
result.append(candidate)
return result
当数据以流的形式输入且无法存储全部数据时,可使用空间优化的哈希表或抽样统计法。
None
或抛出异常)[1,2,3]
需要特殊处理1.0
和 1
是否算相同)GROUP BY + COUNT
组合)方法 | 适用场景 | 时间复杂度 | 空间复杂度 |
---|---|---|---|
哈希表 | 通用众数问题 | O(n) | O(n) |
排序法 | 多数元素问题 | O(n log n) | O(1) |
摩尔投票法 | 出现次数过半的众数问题 | O(n) | O(1) |
推荐选择: - 面试优先选择摩尔投票法(考察算法思维) - 工程实践可考虑哈希表(代码可读性高) “`
(注:全文约1200字,可根据需要增减代码示例或详细说明部分)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。