一群孩子做游戏,现在请你根据游戏得分来发糖果,要求如下:
1. 每个孩子不管得分多少,起码分到一个糖果。
2. 任意两个相邻的孩子之间,得分较多的孩子必须拿多一些糖果。(若相同则无此限制)
给定一个数组 代表得分数组,请返回最少需要多少糖果。
要求: 时间复杂度为 空间复杂度为
数据范围: ,
[1,1,2]
4
最优分配方案为1,1,2
[1,1,1]
3
最优分配方案是1,1,1
n=len(arr) if n==0: return 0 if n==1: return 1 if n>1: back=[1 for i in arr] for i in range(n-1): a=arr[i] b=arr[i+1] if a<b: back[i+1]=back[i]+1 for i in range(1,n): a=arr[-i] b=arr[-i-1] if a<b: if back[-i-1]<back[-i]+1: back[-i-1]=back[-i]+1 return sum(back)
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # pick candy # @param arr int整型一维数组 the array # @return int整型 # class Solution: def candy(self , arr: List[int]) -> int: wave = [1 for i in arr] peak = 0 sum = 1 for i in range(1, len(arr)): if arr[i] > arr[i-1]: wave[i] = max(wave[i-1] + 1, 2) elif arr[i] < arr[i-1]: if wave[i-1] > 0: peak = wave[i-1] wave[i] = -1 else: wave[i] = wave[i-1] - 1 if abs(wave[i]) >= peak: sum = sum + 1 sum = sum + abs(wave[i]) return sum
class Solution: def candy(self , arr ): # write code here res = [1] * len(arr) for i in range(1, len(arr)): if arr[i] > arr[i-1]: res[i] = res[i-1] + 1 for i in range(len(arr)-2, -1, -1): if arr[i] > arr[i+1]: res[i] = max(res[i+1] + 1, res[i]) return sum(res)