LeetCode 分糖果 II

分糖果 II


題目來源: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 所示:
圖例 1

distribute_candies_img_1.jpg

distribute_candies_img_2.jpg

distribute_candies_img_3.jpg

distribute_candies_img_4.jpg

代碼實現


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》問題的主要內容。

歡迎關注微信公衆號《書所集錄》
相關文章
相關標籤/搜索