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

61 阅读1分钟

要解决这个问题,我们可以使用一种称为“摩尔投票算法”(Boyer-Moore Voting Algorithm)的方法。这个算法非常适合用于找出在数组中出现次数超过一半的元素。其基本思想是:

  1. 初始化一个候选元素和一个计数器。
  2. 遍历数组中的每个元素:
    • 如果计数器为0,将当前元素设为候选元素,并将计数器设为1。
    • 如果当前元素与候选元素相同,计数器加1。
    • 如果当前元素与候选元素不同,计数器减1。
  3. 最终的候选元素就是出现次数超过一半的元素。

这个算法的时间复杂度是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. 第一遍遍历:我们通过摩尔投票算法找出可能的候选元素。
  2. 第二遍遍历:我们确认候选元素的出现次数是否超过数组长度的一半。

测试样例:

  • 对于 [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

这个算法能够高效地找到出现次数超过一半的元素。