在第 i 次分配時,將 i+1 顆糖果分配給第 imodn 個人。若剩餘糖果數量 candies<i+1,則分配剩餘的糖果,並結束分配。
減少 candies 的數量,並增加 i 。
返回最終的糖果分配陣列 ans。
複雜度分析
時間複雜度:O(n+candies),其中 candies 表示糖果數量。
初始化答案陣列的時間複雜度為 O(n)。
共需分配 O(candies) 次糖果,每次分配的時間複雜度為 O(1)。具體計算見方法二。
空間複雜度:O(n)。
1 2 3 4 5 6 7 8 9 10
classSolution: defdistributeCandies(self, candies: int, num_people: int) -> List[int]: n = num_people ans = [0] * n i = 0 while candies > 0: # 第 i 次分配 i + 1 顆糖果給第 i % n 個人 ans[i % n] += min(candies, i + 1) candies -= i + 1 i += 1 return ans
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution { public: vector<int> distributeCandies(int candies, int num_people){ int n = num_people; vector<int> ans(n, 0); int i = 0; while (candies > 0) { ans[i % n] += min(candies, i + 1); candies -= i + 1; i++; } return ans; } };
classSolution: defdistributeCandies(self, candies: int, num_people: int) -> List[int]: n = num_people m = int((-1 + sqrt(8 * candies + 1)) / 2) # 可以分配 m 次 q, r = divmod(m, n) # 可以完整分配 q 輪,剩下 r 個 ans = [0] * n for i inrange(n): ans[i] = q * (q - 1) // 2 * n + q * (i + 1) if i < r: ans[i] += q * n + i + 1 elif i == r: ans[i] += candies - m * (m + 1) // 2 return ans
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
classSolution { public: vector<int> distributeCandies(int candies, int num_people){ int n = num_people; int m = (-1 + sqrt(8.0 * candies + 1.0)) / 2; int q = m / n, r = m % n; vector<int> ans(n, 0); for (int i = 0; i < n; i++) { ans[i] = q * (q - 1) / 2 * n + q * (i + 1); if (i < r) ans[i] += q * n + i + 1; elseif (i == r) ans[i] += candies - m * (m + 1) / 2; } return ans; } };