当前位置: 首页 > 后端技术 > Python

LeetCode分糖果II

时间:2023-03-26 15:26:58 Python

分糖果II题目来源:https://leetcode-cn.com/problems/distribute-candies-to-people题目坐成一排分发糖果。我们买了一些糖果,打算分发给排队的n=num_people小朋友。给第一个孩子1颗糖果,给第二个孩子2颗,以此类推,直到给最后一个孩子n颗糖果。然后,我们回到队伍的起点,给第一个孩子n+1颗糖果,给第二个孩子n+2颗糖果,以此类推,直到给最后一个孩子2*n颗糖果。重复以上过程(每次比上次多给一颗糖果,到达队尾后再次从队伍起点开始),直到我们分发完所有的糖果。注意,即使我们手里剩下的糖果不够多(没有比之前的糖果多的糖果),这些糖果也会全部分发给当前的孩子。返回一个数组,长度为num_people,元素之和为candies,表示最终分配的糖果数(即ans[i]表示分配给第i个孩子的糖果数)。示例1:输入: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:输入: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]。Tips:1<=candies<=10^91<=num_people<=1000解题思路:等差数列求和采用数学上的“等差数列求和”的方法来解这道题。让我们先一步步推导公式。从题意可以看出,除了最后一颗糖果的数量由剩余糖果决定外,其他分发的糖果数量都是从1开始的等差数列。如下图1所示:代码implementsclassSolution:defdistributeCandies(self,candies:int,num_people:int)->List[int]:N=num_peopleC=candies#完全分发的糖果数量p=int((2*C+0.25)**0.5-0.5)#剩余糖果数remaining=int(C-p*(p+1)*0.5)#回合数,最后一回合糖果数满排数分配的人数,cols=p//N,p%N#构建一个分配糖果的数组d=[0]*N#遍历,这里i从0开始#按照上面的公式计算,注意这一点foriinrange(N):#得到这一轮完整的糖果,每个人的糖果数量d[i]=(i+1)*rows+N*int(rows*(rows-1)*0.5)#在最后round,得到部分糖果需要加上数字ifi