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/