要解决这个问题,我们可以使用一种称为“摩尔投票算法”(Boyer-Moore Voting Algorithm)的方法。这个算法非常适合用于找出在数组中出现次数超过一半的元素。其基本思想是:
- 初始化一个候选元素和一个计数器。
- 遍历数组中的每个元素:
- 如果计数器为0,将当前元素设为候选元素,并将计数器设为1。
- 如果当前元素与候选元素相同,计数器加1。
- 如果当前元素与候选元素不同,计数器减1。
- 最终的候选元素就是出现次数超过一半的元素。
这个算法的时间复杂度是O(n),空间复杂度是O(1)。
下面是实现这个算法的代码:
def solution(array):
candidate = None
count = 0
# 第一遍遍历,找出候选元素
for num in array:
if count == 0:
candidate = num
count = 1
elif num == candidate:
count += 1
else:
count -= 1
# 第二遍遍历,确认候选元素的出现次数是否超过一半
count = 0
for num in array:
if num == candidate:
count += 1
if count > len(array) // 2:
return candidate
else:
return None # 理论上不会发生,因为题目保证存在这样的元素
if __name__ == "__main__":
# 测试样例
print(solution([1, 3, 8, 2, 3, 1, 3, 3, 3]) == 3)
解释:
- 第一遍遍历:我们通过摩尔投票算法找出可能的候选元素。
- 第二遍遍历:我们确认候选元素的出现次数是否超过数组长度的一半。
测试样例:
- 对于
[1, 3, 8, 2, 3, 1, 3, 3, 3],输出3。 - 对于
[5, 5, 5, 1, 2, 5, 5],输出5。 - 对于
[9, 9, 9, 9, 8, 9, 8, 8],输出9。
这个算法能够高效地找到出现次数超过一半的元素。