数组中有一个数字出现的次数超过数组长度的一半,请找出这个数 字。例如输入一个长度为 9 的数组{1,2,3,2,2,2,5,4,2}。由于数字 2 在 数组中出现了 5 次,超过数组长度的一半,因此输出 2。如果不存在 则输出 0。 要求:时间复杂度不能超过 O(n)
时间: 2024-02-09 17:08:29 浏览: 79
这道题可以使用摩尔投票法(Boyer-Moore Voting Algorithm)来解决,其时间复杂度为 O(n)。
摩尔投票法的核心思想是:如果一个数字出现的次数超过了一半,那么这个数字出现的次数减去其他数字出现的次数总和仍然是大于 0 的。
我们用一个变量 candidate 来保存数组中可能超过一半的数字,用一个变量 count 来统计 candidate 出现的次数。
遍历整个数组,如果当前数字与 candidate 相同,则将 count 加 1;如果当前数字与 candidate 不同,则将 count 减 1。如果 count 变为了 0,那么就将当前数字赋值给 candidate,count 重新置为 1。
遍历完成后,candidate 中保存的数字就是出现次数超过一半的数字。最后再遍历一次数组,统计 candidate 出现的次数,如果出现次数大于数组长度的一半,则返回 candidate,否则返回 0。
以下是代码实现:
```python
def majority_element(nums):
candidate, count = None, 0
for num in nums:
if count == 0:
candidate = num
count = 1
elif num == candidate:
count += 1
else:
count -= 1
if candidate is None:
return 0
count = 0
for num in nums:
if num == candidate:
count += 1
return candidate if count > len(nums) // 2 else 0
```
希望可以帮到你!
阅读全文