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

29 阅读2分钟

问题描述

小R从班级中抽取了一些同学,每位同学都会给出一个数字。我们已知,在这些数字中有一个数字的出现次数超过了数字总数的一半。这个条件保证了多数元素的存在,因此问题的目标是设计一个高效的算法,帮助小R找到这个多数元素。

问题理解

在一个整型数组中,找到一个数字,其出现次数超过数组长度的一半。这个问题被称为寻找“多数元素”的问题。多数元素的定义使得它的出现次数必然比其他所有数字的出现次数之和还要多,因此可以用统计或者特殊遍历的方法来解决。

数据结构选的择

由于我们需要统计每个数字的出现次数,并且最终要找到出现次数最多的数字,使用哈希表(字典)是一个不错的选择。哈希表可以让我们在O(1)的时间复杂度内进行插入和查找操作。

算法步骤

我们先介绍基于哈希表的解决方案,这是最直观的思路。

1. 初始化一个哈希表

创建一个空的哈希表(字典),用于存储每个数字及其出现的次数。键是数字,值是该数字的出现次数。

2. 遍历数组

对数组中的每个数字:

  • 如果数字不在哈希表中,将其加入,并设置计数为 1。
  • 如果数字已存在,更新其计数,计数加 1。
  • 在每次更新计数后,检查当前数字的计数是否已经超过数组长度的一半。如果超过,立即返回该数字。

3. 检查结果

如果遍历完整个数组后还没有找到多数元素,返回“无结果”。但在当前问题中,题目保证了多数元素的存在,这种情况不会发生。

关键步骤

  1. 哈希表的使用

    • 哈希表通过键值对存储数据,支持常数时间复杂度的插入和查找操作。
    • 每个数字作为键,对应的计数作为值。
  2. 实时检查出现次数

    • 每次更新哈希表中的计数后,立即判断当前数字是否为多数元素。
    • 由于多数元素的出现次数必然超过一半,因此我们不需要继续遍历所有数据,一旦找到结果即可提前终止。

代码实现

def solution(array):
    count_map = {}
    for num in array:
        if num in count_map:
            count_map[num] += 1
        else:
            count_map[num] = 1
        if count_map[num] > len(array) // 2:
            return num
    return 0