说明:本篇笔记基于python语言写出
找出整型数组中占比超过一半的数
问题描述
小R从班级中抽取了一些同学,每位同学都会给出一个数字。已知在这些数字中,某个数字的出现次数超过了数字总数的一半。现在需要你帮助小R找到这个数字。
代码思路
这道题可以使用摩尔投票算法来解决
做题步骤如下:
-
初始化:
- 设定一个候选数字
candidate,初始值为None。 - 设定一个计数器
count,初始值为0。
- 设定一个候选数字
-
遍历数组:
-
对于数组中的每一个数字
num:- 如果
count为0,将num设为新的候选数字candidate。 - 如果
num与candidate相同,count加1。 - 如果
num与candidate不同,count减1。
- 如果
-
-
返回结果:
- 遍历结束后,
candidate就是出现次数超过一半的数字。
- 遍历结束后,
答案
# 初始化候选数字和计数
candidate = None
count = 0
# 遍历数组
for num in array:
# 如果计数为0,更换候选数字
if count == 0:
candidate = num
# 如果当前数字与候选数字相同,计数加1
if num == candidate:
count += 1
else:
count -= 1
# 最终的候选数字就是答案
return candidate
if __name__ == "__main__":
# 测试样例
print(solution([1, 3, 8, 2, 3, 1, 3, 3, 3]) == 3)
print(solution([5, 5, 5, 1, 2, 5, 5]) == 5)
print(solution([9, 9, 9, 9, 8, 9, 8, 8]) == 9)
个人思考
摩尔投票算法的巧妙之处:
- 摩尔投票算法的核心思想是通过抵消不同数字的计数来找到出现次数超过一半的数字。这种抵消的思想在很多其他问题中也有应用,例如寻找数组中出现次数最多的元素。
- 算法的关键在于理解“抵消”的概念:如果一个数字的出现次数超过一半,那么即使其他所有数字都与它抵消,最终剩下的仍然是这个数字。
摩尔投票算法不仅在理论上有很好的性能,在实际应用中也非常高效。例如,在处理大规模数据时,空间复杂度的优化尤为重要。这种算法可以应用于各种需要统计元素出现次数的场景,例如选举投票、数据分析等。
我们再扩展一下,将逻辑和关键字改一下,也可以计算出出现次数超过数组长度1/3、1/4等的元素。
总结
这道题主要运用了以下几个知识点:
1. 哈希表(字典)的使用
- 知识点:哈希表是一种数据结构,用于存储键值对,可以在常数时间内进行插入、删除和查找操作。
- 应用:在哈希表计数法中,使用哈希表来记录每个数字出现的次数。
2. 摩尔投票算法
- 知识点:摩尔投票算法是一种用于寻找数组中出现次数超过一半的元素的高效算法。
- 应用:通过抵消不同数字的计数来找到出现次数超过一半的数字,时间复杂度为O(n),空间复杂度为O(1)。
3. 计数器
- 知识点:计数器是一种简单的数据结构,用于记录某个事件发生的次数。
- 应用:在摩尔投票算法中,使用计数器来记录候选数字的出现次数。
4. 遍历数组
- 知识点:遍历数组是一种常见的操作,用于访问数组中的每一个元素。
- 应用:在摩尔投票算法中,通过遍历数组来更新候选数字和计数器。
5. 条件判断
- 知识点:条件判断是编程中常用的控制结构,用于根据条件执行不同的代码块。
- 应用:在摩尔投票算法中,使用条件判断来决定是否更换候选数字或更新计数器。
6. 时间复杂度和空间复杂度分析
- 知识点:时间复杂度和空间复杂度是衡量算法效率的重要指标。
- 应用:通过分析摩尔投票算法的时间复杂度为O(n),空间复杂度为O(1),可以了解其高效性。