leetcode刷题250天(41)——2226. 每个小孩最多能分到多少糖果(二分法)

给你一个 下标从 0 开始 的整数数组 candies 。
数组中的每个元素表示大小为 candies[i] 的一堆糖果。
你可以将每堆糖果分成任意数量的 子堆 ,但无法再将两堆合并到一起。
另给你一个整数 k 。你需要将这些糖果分配给 k 个小孩,使每个小孩分到 相同 数量的糖果。
每个小孩可以拿走 至多一堆 糖果,有些糖果可能会不被分配。
返回每个小孩可以拿走的 最大糖果数目

解题思路:
题干就是说,从每一堆糖都平均除以某个糖数,份数要等于人数 ——> 每人最多多少糖

class Solution(object):
    def maximumCandies(self, candies, k):
        
        # 计算当前总糖果数
        # 如果小于人数 说明没人分不到一个 返回0
        totalCandy = sum(candies)
        if totalCandy < k:
            return 0

        # 每人最少1个 最多total//K个
        min_, max_ = 1, totalCandy//k


        while min_ <= max_:
            middleCandy = min_ + (max_-min_)//2
            # 在分得平均糖数最大值和最小值之间寻找中间值
            # 计算当前 每人从糖堆分得平均数 人数是否还是满足k个
            nowTotalPerson = [i//middleCandy for i in candies]
            cnt = sum(nowTotalPerson)


            # 如果当前人数满足K人, 那就增大每人平均糖数
            if cnt >= k:
                min_ = middleCandy + 1
                
            # 如果当前人数不满足K人, 那就减小每人平均糖数
            else: # cnt <= k
                max_ = middleCandy - 1

        
        return max_
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值