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

98 阅读4分钟

问题描述

小红在和小伙伴玩一个数组游戏,每个同学都会给出一个数字。已知在输入的数组中,某个数字的出现次数超过了数组总长度的一半。现在需要编写一个程序,找出这个数字。


输入输出

输入:一个整数数组 array,长度为 nnn,保证一定存在一个出现次数超过一半的数字。

输出:找到的数字。如果没有符合条件的数字(虽然题目保证不会出现这种情况),返回 0

示例:

示例 1: 输入:

array=[1,3,8,2,3,1,3,3]array = [1, 3, 8, 2, 3, 1, 3, 3]array=[1,3,8,2,3,1,3,3]

输出:

333

示例 2: 输入:

array=[5,5,5,1,2,5,5]array = [5, 5, 5, 1, 2, 5, 5]array=[5,5,5,1,2,5,5]

输出:

555

示例 3: 输入:

array=[9,9,9,9,8,9,8,8,8]array = [9, 9, 9, 9, 8, 9, 8, 8, 8]array=[9,9,9,9,8,9,8,8,8]

输出:

999


解题思路

1. 基本思路

要找出一个数字在数组中出现的次数超过数组长度的一半,可以通过以下方法:

  1. 遍历数组,记录每个数字出现的次数;
  2. 找到出现次数超过 n/2n / 2n/2 的数字。

2. 使用哈希表统计

通过哈希表(Python 中用字典实现),统计数组中每个数字的出现次数。遍历完成后,再次检查哈希表中的数字,找到出现次数超过数组长度一半的数字。

3. 特殊保证

题目保证一定存在一个符合条件的数字,所以可以直接返回找到的数字,无需考虑异常情况。


代码实现


def solution(array):
    # 初始化一个字典存储每个数字的出现次数
    count_dict = {}

    # 遍历数组中的每个元素
    for num in array:
        # 如果该元素已经在字典中,则将出现次数加1
        if num in count_dict:
            count_dict[num] += 1
        else:
            # 如果该元素还不在字典中,则将其加入字典,并将出现次数置为1
            count_dict[num] = 1

    # 计算数组长度的一半
    half_length = len(array) // 2

    # 遍历字典,找到出现次数超过数组长度一半的数字
    for num, count in count_dict.items():
        if count > half_length:
            return num

    # 如果没有找到符合条件的数字,返回0(虽然题目保证一定存在这样的数字)
    return 0

示例解析

示例 1

输入:

array=[1,3,8,2,3,1,3,3]array = [1, 3, 8, 2, 3, 1, 3, 3]array=[1,3,8,2,3,1,3,3]

过程

  1. 遍历数组并统计出现次数,结果为:{1: 2, 3: 4, 8: 1, 2: 1}
  2. 数组长度为 n=8n = 8n=8,一半为 n/2=4n/2 = 4n/2=4;
  3. 数字 3 出现次数为 4,超过一半,输出 3

示例 2

输入:

array=[5,5,5,1,2,5,5]array = [5, 5, 5, 1, 2, 5, 5]array=[5,5,5,1,2,5,5]

过程

  1. 统计出现次数:{5: 5, 1: 1, 2: 1}
  2. 数组长度为 n=7n = 7n=7,一半为 n/2=3.5n/2 = 3.5n/2=3.5;
  3. 数字 5 出现次数为 5,超过一半,输出 5

示例 3

输入:

array=[9,9,9,9,8,9,8,8,8]array = [9, 9, 9, 9, 8, 9, 8, 8, 8]array=[9,9,9,9,8,9,8,8,8]

过程

  1. 统计出现次数:{9: 5, 8: 4}
  2. 数组长度为 n=9n = 9n=9,一半为 n/2=4.5n/2 = 4.5n/2=4.5;
  3. 数字 9 出现次数为 5,超过一半,输出 9

AI 使用

在解题过程中,MarsCode AI 的帮助主要体现在以下几个方面:

  1. 快速生成基础代码

    • 提供了完整的哈希表统计方法;
    • 明确了关键步骤(如遍历数组和字典)。
  2. 逻辑梳理

    • AI 自动提供了解题的基本逻辑,尤其在保证出现次数超过一半时,可以避免过度检查和边界情况。
  3. 代码模块化

    • AI 给出的代码清晰地分为统计、条件判断和结果返回,易于理解和调试。

反思与不足

  1. 缺乏优化建议
    AI 的代码思路虽然直接,但未提及更高效的解法(如摩尔投票法),无法降低空间复杂度。
  2. 边界情况
    如果需要处理未满足条件的情况(如非保证存在多数元素的版本),需要额外的人工补充。

进一步优化

  1. 摩尔投票法:使用一种基于计数的算法,可以将空间复杂度从 O(n)O(n)O(n) 降低到 O(1)O(1)O(1),但适用于题目明确存在超过一半元素的情况。
  2. 代码优化:在写入和更新统计值时,利用更简洁的操作(如 collections.Counter),进一步提升代码可读性。