intuition solution
class Solution:
# time (N/M * M) space O(1) if not consider output space
def distributeCandies(self, candies: int, num_people: int) -> List[int]:
res = [0] * num_people
ptr = 0
round = 0
gives = 0
cnt = 0#round * num_people + index
# termination: candies - cnt < cnt_next(cnt +1)
while candies - cnt > gives:
# reset if ptr reaches the end
if ptr == num_people:
round += 1
ptr = 0
# current candies given out
gives = ptr + 1 + round * num_people
res[ptr] += gives
cnt += gives
ptr += 1
if ptr < num_people :
res[ptr] += candies - cnt
else:
res[ptr-num_people] += candies - cnt
return res
optimize
class Solution:
def distributeCandies(self, candies: int, num_people: int) -> List[int]:
# time O(sqrt(candies)) O(N) N: num_people ~ O(1)
res = [0] * num_people
gives = 0
while candies > 0:
res[gives%num_people] += min(gives+1,candies)
gives += 1
candies -= gives
return res