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

68 阅读3分钟

问题描述

小R从班级中抽取了一些同学,每位同学都会给出一个数字。已知在这些数字中,某个数字的出现次数超过了数字总数的一半。现在需要你帮助小R找到这个数字。


测试样例

样例1:

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

样例2:

输入:array = [5, 5, 5, 1, 2, 5, 5]
输出:5

样例3:

输入:array = [9, 9, 9, 9, 8, 9, 8, 8]
输出:9

我的题解

def solution(array):
    from collections import Counter
    cnt = Counter(array)
    target = max(cnt.values())
    for x, y in cnt.items():
        if y == target:
            return x


if __name__ == "__main__":
    # Add your test cases here

    print(solution([1, 3, 8, 2, 3, 1, 3, 3, 3]) == 3)

豆包提示

代码提示

  1. 理解问题:题目要求找到数组中出现次数超过一半的数字。这意味着这个数字的出现次数必须大于数组长度的一半。

  2. 数据结构选择:你已经使用了 collections.Counter 来统计每个数字的出现次数,这是一个很好的选择。

  3. 算法步骤

    • 使用 Counter 统计每个数字的出现次数。
    • 找到出现次数最多的数字。
    • 检查这个数字的出现次数是否超过数组长度的一半。
  4. 代码实现

    • 你已经正确地使用了 Counter 来统计每个数字的出现次数。
    • 你使用了 max(cnt.values()) 来找到最大的出现次数,但这里需要确保这个最大出现次数确实超过了数组长度的一半。

代码框架

def solution(array):
    from collections import Counter
    cnt = Counter(array)
    
    # 找到出现次数最多的数字
    max_count = max(cnt.values())
    
    # 检查这个数字的出现次数是否超过数组长度的一半
    if max_count > len(array) / 2:
        for x, y in cnt.items():
            if y == max_count:
                return x
    else:
        # 这里需要处理如果没有任何数字出现次数超过一半的情况
        return None  # 或者抛出一个异常,根据题目要求来决定

if __name__ == "__main__":
    # Add your test cases here
    print(solution([1, 3, 8, 2, 3, 1, 3, 3, 3]) == 3)

关键步骤

  • 检查出现次数是否超过一半:在返回结果之前,确保最大出现次数确实超过了数组长度的一半。
  • 处理特殊情况:如果没有任何数字出现次数超过一半,需要处理这种情况。

我的思考

感觉还能再优化一下

def solution(array):
    from collections import Counter
    cnt = Counter(array)
    
    # 找到出现次数最多的数字
    for num, count in cnt.items():
        if count > len(array) / 2:
            return num
    
    # 如果没有找到符合条件的数字,返回 None 或者抛出异常
    return None

if __name__ == "__main__":
    # Add your test cases here
    print(solution([1, 3, 8, 2, 3, 1, 3, 3, 3]) == 3)

关键优化点

  1. 直接检查出现次数

    • 在遍历 Counter 的过程中,直接检查每个数字的出现次数是否超过数组长度的一半。
    • 如果找到符合条件的数字,立即返回,避免不必要的后续操作。
  2. 简化逻辑

    • 去掉了 max 操作,直接在遍历 Counter 的过程中进行检查。

时间复杂度

  • 优化后的代码仍然是 O(n),但减少了不必要的操作,提高了效率。

代码简洁性

  • 代码逻辑更加清晰,减少了冗余代码。