Python解决“找出整形数组中占比超过一半的数”问题

问题描述

小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

解决思路

这道题目综合运用了哈希表和计数算法知识。题目要求找出数组中出现次数超过一半的数字。由于题目明确指出存在这样的数字,因此我们可以通过统计每个数字的出现次数来找到答案。使用哈希表(Python中的Counter)可以高效地统计每个数字的出现次数,然后遍历哈希表找到出现次数超过数组长度一半的数字。

统计数字出现次数:使用Counter对数组中的每个数字进行计数,生成一个哈希表,键为数字,值为该数字在数组中出现的次数。
查找超过一半的数字:遍历哈希表,找到第一个满足出现次数乘以2大于数组长度的数字,即为答案。

时间复杂度:O(n),其中n是数组的长度。我们需要遍历数组一次来统计数字的出现次数,然后再遍历哈希表一次来找到目标数字。
空间复杂度:O(n),哈希表的空间复杂度与数组中不同数字的数量成正比,最坏情况下为n。

代码

法1

根据思路逻辑解法

def solution(array):
    # 创建一个字典来记录每个数字的出现次数
    count_dict = {}
    
    # 遍历数组,统计每个数字的出现次数
    for num in array:
        # 如果数字已经在字典中,增加其计数
        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

if __name__ == "__main__":
    # 添加你的测试用例
    print(solution(array = [1, 3, 8, 2, 3, 1, 3, 3, 3]))
    print(solution(array = [5, 5, 5, 1, 2, 5, 5]))
    print(solution(array = [9, 9, 9, 9, 8, 9, 8, 8]))

法2

简化方法:

def solution(array: list) -> int:
    from collections import Counter
    c = Counter(array)
    return next(k for k, v in c.items() if v * v > len(array))


if __name__ == '__main__':
    print(solution(array = [1, 3, 8, 2, 3, 1, 3, 3, 3]) == 3)
    print(solution(array = [5, 5, 5, 1, 2, 5, 5]) == 5)
    print(solution(array = [9, 9, 9, 9, 8, 9, 8, 8]) == 9)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啥都鼓捣的小yao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值