一.问题描述
小S有一批糖果 candies,他打算将这些糖果分给排成一列的 n 个小朋友。糖果的分发规则如下:
1.第一个小朋友获得 1 颗糖果,第二个小朋友获得 2 颗糖果,依此类推,直到第 n 个小朋友获得 n 颗糖果。
2.然后回到队伍的起点,继续分糖果。第一个小朋友这次获得 n + 1 颗糖果,第二个小朋友获得 n + 2 颗,依此类推,直到第 n 个小朋友获得 2 * n 颗糖果。
3.重复上述过程,每次分发的糖果数增加 1,直到糖果分完。如果剩下的糖果数量不足以满足当前轮次分发的要求,则将所有剩余的糖果分给当前的小朋友。
你需要返回一个长度为 n 的数组,表示每个小朋友最终获得的糖果数。
二.思路分析
1.关键要素
糖果总数(candies):这是需要被分发的糖果的总数量。
小朋友数量(n):这是接收糖果的小朋友的数量,他们排成一列。
2. 初始化:
创建一个长度为n的数组count,用于存储每个小朋友最终获得的糖果数。
初始化变量num为1,表示当前要分发的糖果数。
初始化变量index为0,表示当前分发到哪个小朋友(从0开始计数)。
3.分发糖果:
使用一个while循环,当还有糖果剩余时(candies > 0)继续分发。
在每次循环中,检查当前要分发的糖果数num是否小于或等于剩余的糖果数candies。
如果是,将num颗糖果分发给当前的小朋友(count[index] += num),并从剩余的糖果中减去已分发的糖果数(candies -= num)。
如果不是,将剩余的糖果全部分发给当前的小朋友(count[index] += candies),并将剩余的糖果数设置为0(candies = 0),然后跳出循环。
更新当前要分发的糖果数(num++)。
更新当前分发到的小朋友索引(index = (index + 1) % n),使用模运算确保索引在0到n-1之间循环。
4. 返回结果:
当所有糖果分发完毕后,返回count数组,其中包含了每个小朋友最终获得的糖果数。
三.代码详情
public static int[] solution(int candies, int n) {
// write code here
int []count =new int[n];
int num=1;
int index=0;
while(candies>0){
if(candies>=num)
{
count[index]+=num;
candies-=num;
}
else{
count[index]+=candies;
candies=0;
break;
}
num++;
index=(index+1)%n;
}
return count;
}
四.时间复杂度
该算法的时间复杂度是O(candies)。该算法的时间复杂度主要取决于外层循环while(candies>0)。