Skip to content

2226. 每个小孩最多能分到多少糖果 Medium

给你一个 下标从 0 开始 的整数数组 candies 。数组中的每个元素表示大小为 candies[i] 的一堆糖果。你可以将每堆糖果分成任意数量的 子堆 ,但 无法 再将两堆合并到一起。

另给你一个整数 k 。你需要将这些糖果分配给 k 个小孩,使每个小孩分到 相同 数量的糖果。每个小孩可以拿走 至多一堆 糖果,有些糖果可能会不被分配。

返回每个小孩可以拿走的 最大糖果数目 。

示例 1:
输入:candies = [5,8,6], k = 3
输出:5
解释:可以将 candies[1] 分成大小分别为 5 和 3 的两堆,然后把 candies[2] 分成大小分别为 5 和 1 的两堆。现在就有五堆大小分别为 5、5、3、5 和 1 的糖果。可以把 3 堆大小为 5 的糖果分给 3 个小孩。可以证明无法让每个小孩得到超过 5 颗糖果。

示例 2:
输入:candies = [2,5], k = 11
输出:0
解释:总共有 11 个小孩,但只有 7 颗糖果,但如果要分配糖果的话,必须保证每个小孩至少能得到 1 颗糖果。因此,最后每个小孩都没有得到糖果,答案是 0 。

解题思路

输入: 一个整数数组 candies 表示糖果的堆数,每堆的香蕉数量;一个整数 k 表示小孩数量

输出: 返回将这些糖果分给小孩每个小孩可以拿走的最大糖果数

本题属于二分答案类问题。

我们可以二分查找:假设每人分 x 颗糖果,能不能分给 k 个孩子?

用整除计算每袋能分出几份 x 糖果:

  • 比如袋子有 11 颗糖,每人拿 3 颗,可以分出 11 // 3 = 3 份。
  • 把所有袋子能分出的份数加起来,看是否 ≥ k。
  • 如果可以,说明 x 还可以更大;否则 x 太大了。

代码实现

python
class Solution:
    def maximumCandies(self, candies: List[int], k: int) -> int:
        # 判断每个孩子分得 x 颗糖时,是否能满足至少 k 个孩子
        def can_get(x):
            count = 0
            for c in candies:
                count += c // x  # 当前袋子能分出多少份 x
            return count >= k

        left, right = 1, max(candies)  # 分配区间:[1, 最大一袋糖的数量]
        ans = 0  # 保存最大可行的糖果数

        while left <= right:
            mid = (left + right) // 2  # 尝试分配 mid 个糖果给每个孩子

            if can_get(mid):
                ans = mid         # 当前 mid 可行,尝试更大的
                left = mid + 1
            else:
                right = mid - 1   # 当前 mid 太大,尝试更小的

        return ans
javascript
/**
 * @param {number[]} candies
 * @param {number} k
 * @return {number}
 */
var maximumCandies = function(candies, k) {
    function canGet(x) {
        let count = 0;

        for (let c of candies) {
            count += Math.floor(c / x);
        }

        return count >= k;
    }

    let left = 1;
    let right = Math.max(...candies);
    let ans = 0;

    while (left <= right) {
        const mid = Math.floor((left + right) / 2);
        if (canGet(mid)) {
            ans = mid;
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }

    return ans;
};

复杂度分析

时间复杂度:O(nlog M), Mcandies 的长度

空间复杂度:O(1)

链接

2226 国际版

2226 中文版