青训营 X 豆包 MarsCode 技术训练营第四课 找出整型数组中占比超过一半的数 | 豆包 MarsCode AI 刷题

37 阅读2分钟

问题分析

在这个问题中,我们需要找出一个在整型数组中出现次数超过数组长度一半的数字。这个问题可以通过多种方法解决,但我们需要选择一种时间复杂度较低且易于实现的方法。

方法选择

一个有效的方法是使用摩尔投票算法(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就是出现次数超过一半的数字。

解题步骤

  1. 初始化candidate为数组的第一个元素,count为1。
  2. 遍历数组中的每个元素,根据摩尔投票算法更新candidatecount
  3. 遍历结束后,candidate即为所求的数字。

具体实现

以下是使用摩尔投票算法解决这个问题的Python代码示例:

def find_majority_element(array):
    candidate = None
    count = 0
    
    for num in array:
        if count == 0:
            candidate = num
            count = 1
        elif candidate == num:
            count += 1
        else:
            count -= 1
    
    return candidate

# 测试样例
print(find_majority_element([1, 3, 8, 2, 3, 1, 3, 3, 3]))  # 输出: 3
print(find_majority_element([5, 5, 5, 1, 2, 5, 5]))        # 输出: 5
print(find_majority_element([9, 9, 9, 9, 8, 9, 8, 8]))      # 输出: 9

测试样例验证

  1. 样例1:输入 array = [1, 3, 8, 2, 3, 1, 3, 3, 3],输出 3

    • 解释:数字3出现了6次,占数组长度的6/9,超过一半。
  2. 样例2:输入 array = [5, 5, 5, 1, 2, 5, 5],输出 5

    • 解释:数字5出现了5次,占数组长度的5/7,超过一半。
  3. 样例3:输入 array = [9, 9, 9, 9, 8, 9, 8, 8],输出 9

    • 解释:数字9出现了5次,占数组长度的5/8,超过一半。

总结

通过这个问题的解决,我深刻体会到了摩尔投票算法的巧妙之处。这个算法通过简单的计数和候选数字的更新,能够在O(n)的时间复杂度和O(1)的空间复杂度内找到出现次数超过一半的数字。

这次解题经历不仅提高了我的编程能力,也加深了我对算法设计和优化方法的理解。摩尔投票算法是一个非常实用的工具,适用于解决类似的问题,具有很高的实用价值。