题目:找出整型数组中占比超过一半的数 一、题目解析 def solution(array): # 初始化候选数字和计数 candidate = None count = 0
# 遍历数组中的每个元素
for num in array:
# 如果计数为0,更新候选数字
if count == 0:
candidate = num
count = 1
# 如果当前元素与候选数字相同,增加计数
elif 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) 当然,我可以给你一些思路提示来帮助你更好地理解如何解决这个问题。
解题思路
-
理解问题:
- 你需要找到数组中出现次数超过一半的元素。这意味着这个元素的出现次数比其他所有元素的出现次数之和还要多。
-
数据结构选择:
- 你不需要额外的数据结构,只需要两个变量:一个用于存储当前候选元素,另一个用于存储当前候选元素的计数。
-
算法步骤:
- 初始化:
- 初始化两个变量:
candidate用于存储候选元素,count用于存储当前候选元素的计数。
- 初始化两个变量:
- 遍历数组:
- 对于数组中的每个元素:
- 如果
count为 0,将当前元素设为candidate,并将count设为 1。 - 如果当前元素与
candidate相同,则count加 1。 - 如果当前元素与
candidate不同,则count减 1。
- 如果
- 对于数组中的每个元素:
- 返回结果:
- 最终,
candidate就是我们要找的元素。
- 最终,
- 初始化:
candidate用于存储当前的候选元素。count用于记录当前候选元素的计数。- 通过遍历数组,我们不断更新
candidate和count,最终candidate就是我们要找的元素。 二、知识总结
-
摩尔投票算法(Boyer-Moore Voting Algorithm) :
- 概念:摩尔投票算法是一种用于在数组中找到出现次数超过一半的元素的高效算法。它的时间复杂度为 O(n),空间复杂度为 O(1)。
- 原理:算法的核心思想是通过“投票”的方式来确定候选元素。具体来说,遍历数组时,如果当前元素与候选元素相同,则计数加1;如果不同,则计数减1。当计数为0时,更新候选元素为当前元素。
-
计数器(Counter) :
- 概念:计数器用于记录某个元素在数组中出现的次数。
- 应用:在这个问题中,计数器用于记录当前候选元素的出现次数。
-
候选元素(Candidate) :
- 概念:候选元素是指当前被认为是出现次数超过一半的元素。
- 更新条件:当计数器为0时,更新候选元素为当前元素。
-
遍历数组:
- 概念:遍历数组是指逐个访问数组中的每个元素。
- 应用:在这个问题中,我们需要遍历数组中的每个元素,以确定候选元素和计数器的变化。
-
- 初始化:
candidate和count初始化为None和0。
- 初始化:
- 遍历数组:对于每个元素
num,根据count的值更新candidate和count。 - 返回结果:最终的
candidate就是出现次数超过一半的元素。 三、学习计划 利用AI完成题目后再用代码软件进行练习。 四、工具应用 使用免费的代码软件如Red Panda自己练习。