1103. Distribute Candies to People

We distribute some number of candies, to a row of n = num_people people in the following way:

We then give 1 candy to the first person, 2 candies to the second person, and so on until we give n candies to the last person.

Then, we go back to the start of the row, giving n + 1 candies to the first person, n + 2 candies to the second person, and so on until we give 2 * n candies to the last person.

This process repeats (with us giving one more candy each time, and moving to the start of the row after we reach the end) until we run out of candies.  The last person will receive all of our remaining candies (not necessarily one more than the previous gift).

Return an array (of length num_people and sum candies) that represents the final distribution of candies.

Example 1:

Input: candies = 7, num_people = 4
Output: [1,2,3,1]
Explanation:
On the first turn, ans[0] += 1, and the array is [1,0,0,0].
On the second turn, ans[1] += 2, and the array is [1,2,0,0].
On the third turn, ans[2] += 3, and the array is [1,2,3,0].
On the fourth turn, ans[3] += 1 (because there is only one candy left), and the final array is [1,2,3,1].

Example 2:

Input: candies = 10, num_people = 3
Output: [5,2,3]
Explanation:
On the first turn, ans[0] += 1, and the array is [1,0,0].
On the second turn, ans[1] += 2, and the array is [1,2,0].
On the third turn, ans[2] += 3, and the array is [1,2,3].
On the fourth turn, ans[0] += 4, and the final array is [5,2,3].

Constraints:

  • 1 <= candies <= 10^9
  • 1 <= num_people <= 1000

这道题说是有一些糖果要发给n个人,第一轮是第一个人发一个,第二个人发两个,第n个人发n个,第二轮是第一个人发 n+1 个,第二个人发 n+2 个,第n个人发 2n 个,以此类推,直到发到某个人时不够目标个数,此时将剩余的糖全给该人,并停止分发。,问最终每个人会得到多少个糖。既然是 Easy 的题目,想太多太复杂的解法就是对其的不尊重,二话不说直接上暴力破解法,用变量i表示当前人得到的糖数减1,这里减1的原因是想将其也当作数组坐标来用,因为数组坐标都是从0开始的。虽然之后i会累加到很大,但是只要对n取余,就是正确的坐标位置,此时该人得到的糖果个数为当前剩余的糖果个数 candies 和 i+1 之间的较小值,然后 candies 需要减去 i+1,for 循环的执行条件是 candies 大于0,这样当糖果发完了之后就退出了,参见代码如下:

class Solution {
public:
    vector<int> distributeCandies(int candies, int num_people) {
        vector<int> res(num_people);
        for (int i = 0; candies > 0; ++i) {
            res[i % num_people] += min(candies, i + 1);
            candies -= (i + 1);
        }
        return res;
    }
};

讨论:这道题还有一种比较叼的解法,通过观察可以发现,发糖的顺序就是一个等差数列,那么利用求和公式可以快速定位出数列的长度,根据这个长度可以推算出每个人得到的糖果总数,具体可以参见 lee215 大神的帖子

Github 同步地址:

https://github.com/grandyang/leetcode/issues/1103

参考资料:

https://leetcode.com/problems/distribute-candies-to-people/

https://leetcode.com/problems/distribute-candies-to-people/discuss/323314/JavaPython3-Easy-code-w-explanation-and-analysis.

https://leetcode.com/problems/distribute-candies-to-people/discuss/323364/JavaC%2B%2BPython-Math-Solution-and-Simulation-O(1)-to-get-each

LeetCode All in One 题目讲解汇总(持续更新中…)


转载请注明来源于 Grandyang 的博客 (grandyang.com),欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 grandyang@qq.com

💰


微信打赏


Venmo 打赏

(欢迎加入博主的知识星球,博主将及时答疑解惑,并分享刷题经验与总结,试运营期间前五十位可享受半价优惠~)

×

Help us with donation