題目來源:https://leetcode-cn.com/problems/distribute-candies-to-peoplepython
排排坐,分糖果。數組
咱們買了一些糖果 candies
,打算把它們分給排好隊的 n = num_people
個小朋友。bash
給第一個小朋友 1 顆糖果,第二個小朋友 2 顆,依此類推,直到給最後一個小朋友 n 顆糖果。微信
而後,咱們再回到隊伍的起點,給第一個小朋友 n + 1
顆糖果,第二個小朋友 n + 2
顆,依此類推,直到給最後一個小朋友 2 * n
顆糖果。spa
重複上述過程(每次都比上一次多給出一顆糖果,當到達隊伍終點後再次從隊伍起點開始),直到咱們分完全部的糖果。注意,就算咱們手中的剩下糖果數不夠(不比前一次發出的糖果多),這些糖果也會所有發給當前的小朋友。3d
返回一個長度爲 num_people
、元素之和爲 candies
的數組,以表示糖果的最終分發狀況(即 ans[i]
表示第 i
個小朋友分到的糖果數)。code
示例 1:blog
輸入:candies = 7, num_people = 4 輸出:[1,2,3,1] 解釋: 第一次,ans[0] += 1,數組變爲 [1,0,0,0]。 第二次,ans[1] += 2,數組變爲 [1,2,0,0]。 第三次,ans[2] += 3,數組變爲 [1,2,3,0]。 第四次,ans[3] += 1(由於此時只剩下 1 顆糖果),最終數組變爲 [1,2,3,1]。
示例 2:leetcode
輸入:candies = 10, num_people = 3 輸出:[5,2,3] 解釋: 第一次,ans[0] += 1,數組變爲 [1,0,0]。 第二次,ans[1] += 2,數組變爲 [1,2,0]。 第三次,ans[2] += 3,數組變爲 [1,2,3]。 第四次,ans[0] += 4,最終數組變爲 [5,2,3]。
提示:rem
1 <= candies <= 10^9 1 <= num_people <= 1000
用數學 「等差數列求和」 的方法來解決這個問題。先來逐步推導公式。
由題意可知,除了最後一份糖果的數量是由剩餘的糖果數量決定,其餘已分配的糖果數量是從 1 開始構成的等差數列。
以下圖例 1 所示:
class Solution: def distributeCandies(self, candies: int, num_people: int) -> List[int]: N = num_people C = candies # 完整分配的糖果份數 p = int((2 * C + 0.25) ** 0.5 - 0.5) # 剩餘的糖果數 remaining = int(C - p * (p + 1) * 0.5) # 回合數,以及最後一個回合分配到完整糖果數的人數 rows, cols = p // N, p % N # 構建分配糖果的數組 d = [0] * N # 遍歷,這裏 i 是從 0 開始的 # 根據上面的公式計算式,需注意這一點 for i in range(N): # 得到完整糖果數回合,每一個人的糖果數 d[i] = (i + 1) * rows + N * int(rows * (rows - 1) * 0.5) # 最後一個回合,一部分得到完整糖果數,須要額外加上 if i < cols: d[i] += i + 1 + N * rows # 最後分配的一我的,分到剩餘的糖果 d[cols] += remaining # 返回分配的糖果數組 return d
以上就是使用數學方法《等差數列求和》,解決《分糖果 II》問題的主要內容。
歡迎關注微信公衆號《書所集錄》