Description
排排坐,分糖果。
我们买了一些糖果 candies,打算把它们分给排好队的 n = num_people 个小朋友。
给第一个小朋友 1 颗糖果,第二个小朋友 2 颗,依此类推,直到给最后一个小朋友 n 颗糖果。
然后,我们再回到队伍的起点,给第一个小朋友 n + 1 颗糖果,第二个小朋友 n + 2 颗,依此类推,直到给最后一个小朋友 2 * n 颗糖果。
重复上述过程(每次都比上一次多给出一颗糖果,当到达队伍终点后再次从队伍起点开始),直到我们分完所有的糖果。注意,就算我们手中的剩下糖果数不够(不比前一次发出的糖果多),这些糖果也会全部发给当前的小朋友。
返回一个长度为 num_people、元素之和为 candies 的数组,以表示糖果的最终分发情况(即 ans[i] 表示第 i 个小朋友分到的糖果数)。
Analyze
这题题目没有歧义,就是给一个数组的长度 num_people 和总数 candies,要求将 candies 按1,2,3...这样循环发给数组中的每一个元素直到 candies 为0。
下面是题目给的函数:
结合题意应该不难理解
- @param candies 糖果总数
- @param num_people 总人数
- @param returnSize 返回的数组长度
根据题意知道 returnSize 里表示的长度应该和 num_people 一样, 这道题唯一难点就是(其实算不上难点)当到了数组最后时怎么倒回开头,这里有两个办法:
- 一个是加一个判断,若到了最后,把下标重新赋值为0
- 第二种是用取余符号
Realization
-
程序开头有提示返回的数组必须要自己申请空间
-
申请完空间应该先初始化为0
- 主要算法
- 这里利用的是取余来保证数组不会越界
- 最后返回数组就可以了
-
提交
Dictionary
这题相对来说其实算很简单的题目了,基本不涉及什么算法,也实在没什么好说的,关于主要算法的实现,也可以用 while 循环来实现,用 index 来表示数组的下标,用另一个变量 n 来表示当前需要分配的糖果数,最后的跳出循环条件改为 candies <= n时 break 出循环就行了,这样写会比上面的简洁许多。
附源代码
/*
* @lc app=leetcode.cn id=1103 lang=c
*
* [1103] ??? II
*/
// @lc code=start
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* distributeCandies(int candies, int num_people, int* returnSize){
*returnSize = num_people;
int* a = (int*)malloc(sizeof(int) * num_people);
for(int i = 0; i < num_people; ++i)
{
a[i] = 0;
}
for(int i = 0; candies>0; ++i)
{
if(candies - 1 - i <= 0)
{
a[i%num_people] += candies;
}
else
{
a[i%num_people] = a[i%num_people] + 1 + i;
}
candies = candies - 1 - i;
}
return a;
}
// @lc code=end