完成一半题目【S】将题目分配给指定人数时,至少会分配多少种类型题

1、字典统计 + 排序 + 贪心分配

  • 解题思路:使用字典统计每个题目的数量,然后基于题目数量倒序排序,并优先分配数量最多的类型题,直到所有人均能分配到为止。
class Solution:
    def halfQuestions(self, questions: List[int]) -> int:
        from collections import Counter
        # jy: 统计各个问题类型的数量
        dict_q_count = Counter(questions)

        # jy: 计算人数
        p_num = len(questions) // 2
        
        # jy: 基于问题类型的数量进行排序
        ls_ = [[num, type_] for type_, num in dict_q_count.items()]
        ls_sorted = sorted(ls_, reverse=True)

        # jy: 统计至少包含多少种知识类型
        res_ = 1
        # jy: 统计知识类型数分配给多少人
        sum_ = 0
        for ls_i in ls_sorted:
            sum_ += ls_i[0]
            # jy: 如果当前知识点类型的数量分配了之后总人数还小于 p_num, 则
            #     表明还需要使用下一种知识类型来分配给剩余的人
            if sum_ < p_num:
                res_ += 1
            else:
                break
        return res_

2、改写解法 1

class Solution:
    def halfQuestions(self, questions: List[int]) -> int:
        n = len(questions) // 2
        num_freq = sorted(collections.Counter(questions).items(),
                          key = lambda x: x[1], reverse=True)
        cnt = res = 0
        for _, freq in num_freq:
            if cnt < n: 
                cnt += freq
                res += 1
        return res

此处为语雀内容卡片,点击链接查看:融码一生 · 语雀

  • 23
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

融码一生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值