找出整形数组中占比超过一半的数 | 豆包MarsCode AI刷题

52 阅读5分钟

好的,我可以给你一些代码提示来帮助你解决这个问题。我们可以使用一种称为“摩尔投票算法”(Boyer-Moore Voting Algorithm)的方法来高效地找到数组中出现次数超过一半的元素。

解题思路

  1. 初始化:我们需要一个变量 candidate 来存储当前的候选元素,以及一个计数器 count 来记录该候选元素的票数。
  2. 遍历数组:对于数组中的每一个元素:
    • 如果 count 为 0,则将当前元素设为 candidate,并将 count 设为 1。
    • 如果当前元素与 candidate 相同,则 count 加 1。
    • 如果当前元素与 candidate 不同,则 count 减 1。
  3. 最终结果:遍历结束后,candidate 即为出现次数超过一半的元素。

代码提示

你可以根据上述思路,在 solution 函数中实现这个算法。以下是一些代码提示:

def solution(array):
    # 初始化候选元素和计数器
    candidate = None
    count = 0
    
    # 遍历数组
    for num in array:
        # 如果计数器为0,更新候选元素
        if count == 0:
            candidate = num
            count = 1
        # 如果当前元素与候选元素相同,计数器加1
        elif num == candidate:
            count += 1
        # 如果当前元素与候选元素不同,计数器减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 用于记录候选元素的票数。
  • 通过遍历数组,我们不断更新 candidatecount,最终 candidate 即为出现次数超过一半的元素。

你可以根据这个提示继续完善你的代码。如果你有任何问题或需要进一步的帮助,请告诉我!

摩尔投票算法(Boyer-Moore Voting Algorithm)是一种高效的算法,用于在数组中找到出现次数超过一半的元素。这个算法的时间复杂度为 O(n),空间复杂度为 O(1),非常适合解决这个问题。

解题思路

  1. 初始化:我们需要一个变量 candidate 来存储当前的候选元素,以及一个计数器 count 来记录该候选元素的票数。
  2. 遍历数组:对于数组中的每一个元素:
    • 如果 count 为 0,则将当前元素设为 candidate,并将 count 设为 1。
    • 如果当前元素与 candidate 相同,则 count 加 1。
    • 如果当前元素与 candidate 不同,则 count 减 1。
  3. 最终结果:遍历结束后,candidate 即为出现次数超过一半的元素。

代码实现

你可以根据上述思路,在 solution 函数中实现这个算法。以下是完整的代码实现:

def solution(array):
    # 初始化候选元素和计数器
    candidate = None
    count = 0
    
    # 遍历数组
    for num in array:
        # 如果计数器为0,更新候选元素
        if count == 0:
            candidate = num
            count = 1
        # 如果当前元素与候选元素相同,计数器加1
        elif num == candidate:
            count += 1
        # 如果当前元素与候选元素不同,计数器减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 用于记录候选元素的票数。
  • 通过遍历数组,我们不断更新 candidatecount,最终 candidate 即为出现次数超过一半的元素。

测试用例

if __name__ == "__main__": 部分,你可以添加更多的测试用例来验证你的代码是否正确。

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)

你可以根据这个提示继续完善你的代码。如果你有任何问题或需要进一步的帮助,请告诉我!

摩尔投票算法(Boyer-Moore Voting Algorithm)是一种高效的算法,用于在数组中找到出现次数超过一半的元素。这个算法的时间复杂度为 O(n),空间复杂度为 O(1),非常适合解决这个问题。

解题思路

  1. 初始化:我们需要一个变量 candidate 来存储当前的候选元素,以及一个计数器 count 来记录该候选元素的票数。
  2. 遍历数组:对于数组中的每一个元素:
    • 如果 count 为 0,则将当前元素设为 candidate,并将 count 设为 1。
    • 如果当前元素与 candidate 相同,则 count 加 1。
    • 如果当前元素与 candidate 不同,则 count 减 1。
  3. 最终结果:遍历结束后,candidate 即为出现次数超过一半的元素。

代码实现

你可以根据上述思路,在 solution 函数中实现这个算法。以下是完整的代码实现:

def solution(array):
    # 初始化候选元素和计数器
    candidate = None
    count = 0
    
    # 遍历数组
    for num in array:
        # 如果计数器为0,更新候选元素
        if count == 0:
            candidate = num
            count = 1
        # 如果当前元素与候选元素相同,计数器加1
        elif num == candidate:
            count += 1
        # 如果当前元素与候选元素不同,计数器减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 用于记录候选元素的票数。
  • 通过遍历数组,我们不断更新 candidatecount,最终 candidate 即为出现次数超过一半的元素。

测试用例

if __name__ == "__main__": 部分,你可以添加更多的测试用例来验证你的代码是否正确。

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)

你可以根据这个提示继续完善你的代码。如果你有任何问题或需要进一步的帮助,请告诉我!