1. 问题背景与题目解析
今天我们来拆解LeetCode第1103题"Distribute Candies to People"(分糖果II)。这是一道看似简单但暗藏玄机的数学模拟题,在周赛和日常练习中经常出现。题目要求我们按照特定规则将一堆糖果分发给一群人,看似直接但需要考虑循环分发和糖果递减的边界条件。
题目描述如下:我们有一些糖果(candies)和一些人(num_people),需要按照以下规则分发:
- 从第一个人开始,依次给每个人发糖果
- 每次发的糖果数量比前一次多1(第一次发1颗,第二次发2颗,依此类推)
- 当糖果不够发当前轮次的数量时,将剩余糖果全部给当前这个人
- 返回一个数组表示每个人最终获得的糖果数量
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 暴力解法与直接模拟
2.1 基础实现思路
最直观的解法就是完全按照题目描述的规则进行模拟分发。我们需要维护几个关键变量:
- remaining_candies:剩余糖果数量(初始为总糖果数)
- current_give:当前应该分发的糖果数量(初始为1)
- person_index:当前分发到的人的索引(初始为0)
python复制def distributeCandies(candies, num_people):
result = [0] * num_people
current_give = 1
i = 0
while candies > 0:
give = min(current_give, candies)
result[i] += give
candies -= give
current_give += 1
i = (i + 1) % num_people
return result
2.2 时间复杂度分析
这种解法的时间复杂度取决于糖果分发轮次。最坏情况下(糖果足够多),时间复杂度为O(√candies),因为1+2+...+k = k(k+1)/2 ≤ candies,所以k≈√(2candies)。对于LeetCode的测试用例范围来说,这种解法完全足够。
2.3 边界条件处理
在实际编码中需要注意几个边界情况:
1.
