排排坐,分糖果。
我们买了一些糖果
candies
,打算把它们分给排好队的n = num_people
个小朋友。给第一个小朋友 1 颗糖果,第二个小朋友 2 颗,依此类推,直到给最后一个小朋友
n
颗糖果。然后,我们再回到队伍的起点,给第一个小朋友
n + 1
颗糖果,第二个小朋友n + 2
颗,依此类推,直到给最后一个小朋友2 * n
颗糖果。重复上述过程(每次都比上一次多给出一颗糖果,当到达队伍终点后再次从队伍起点开始),直到我们分完所有的糖果。注意,就算我们手中的剩下糖果数不够(不比前一次发出的糖果多),这些糖果也会全部发给当前的小朋友。
返回一个长度为
num_people
、元素之和为candies
的数组,以表示糖果的最终分发情况(即ans[i]
表示第i
个小朋友分到的糖果数)。
分享一下我的代码与思路
class Solution {
public int[] distributeCandies(int candies, int num_people) {
//创建答案数组
int[] ans = new int[num_people] ;
//查找可循环次数(运用解方程思想)
int count = (int)(Math.pow(2 * candies + 1.0 / 4, 1.0 / 2) - 1.0 / 2) / num_people;
//循环
for (int j = 0; j < count; j++)
for (int i = 0; i < num_people; i++) {
ans[i] +=1+ i + j * num_people;
}
candies = candies - (1 + count * num_people) * num_people * count / 2;
//最后循环过后分配candies
for (int i = 0; i < num_people; i++) {
if (candies >= count * num_people + i+1) {
ans[i] += count * num_people + i+1;
candies -= count * num_people + i+1;
} else {
ans[i] += candies;
candies = 0;
break;
}
}
//返回
return ans;
}
}