您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# LeetCode如何求数组中出现次数超过一半的数字
## 问题描述
在LeetCode的面试题中,常会遇到这样一个问题:给定一个大小为n的数组,找出其中出现次数超过⌊n/2⌋次的数字。例如:
- 输入:[3,2,3]
输出:3
- 输入:[2,2,1,1,1,2,2]
输出:2
## 常见解法分析
### 方法一:哈希表统计法
**时间复杂度:O(n)**
**空间复杂度:O(n)**
通过哈希表记录每个数字出现的次数,最后遍历哈希表找到满足条件的数字。
```python
def majorityElement(nums):
counts = {}
for num in nums:
counts[num] = counts.get(num, 0) + 1
if counts[num] > len(nums) // 2:
return num
优点:思路直观,适用于任何数据分布
缺点:需要额外空间存储哈希表
时间复杂度:O(nlogn)
空间复杂度:O(1)或O(n)(取决于是否原地排序)
将数组排序后,中间位置的元素必定是众数。
def majorityElement(nums):
nums.sort()
return nums[len(nums)//2]
优点:代码简洁
缺点:修改了原数组,排序耗时较高
时间复杂度:O(n)
空间复杂度:O(1)
通过抵消策略找到可能的主元素,最终验证其是否满足条件。
def majorityElement(nums):
candidate, count = None, 0
for num in nums:
if count == 0:
candidate = num
count += (1 if num == candidate else -1)
return candidate
核心思想: 1. 初始化候选人和计数器 2. 遍历时遇到相同数字则+1,不同则-1 3. 计数器归零时更换候选人
优势:不需要额外空间,线性时间完成
这种算法在以下场景中有重要应用: 1. 大规模数据统计(如选举计票) 2. 实时系统中的多数元素检测 3. 数据压缩中的高频值处理
方法 | 时间复杂度 | 空间复杂度 | 适用场景 |
---|---|---|---|
哈希表统计 | O(n) | O(n) | 需要精确计数时 |
排序法 | O(nlogn) | O(1) | 允许修改原数组 |
摩尔投票法 | O(n) | O(1) | 最优解,推荐面试使用 |
在面试中,建议优先解释摩尔投票法的思路,其高效的时空复杂度往往能体现算法优化能力。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。