一群孩子做游戏,现在请你根据游戏得分来发糖果,要求如下:
1. 每个孩子不管得分多少,起码分到一个糖果。
2. 任意两个相邻的孩子之间,得分较多的孩子必须拿多一些糖果。(若相同则无此限制)
给定一个数组 代表得分数组,请返回最少需要多少糖果。
要求: 时间复杂度为 空间复杂度为
数据范围: ,
[1,1,2]
4
最优分配方案为1,1,2
[1,1,1]
3
最优分配方案是1,1,1
class Solution: def candy(self , arr: List[int]) -> int: # write code here nums = [1 for i in range(len(arr))] for i in range(1, len(arr)): if arr[i] > arr[i - 1]: nums[i] = nums[i - 1] + 1 for j in range(len(arr)-1,0,-1): if arr[j] < arr[j - 1] and nums[j] >= nums[j - 1]: nums[j - 1] = nums[j] + 1 return sum(nums)
class Solution: def candy(self , arr: List[int]) -> int: # write code here if len(arr) == 0: return 0 k = [1] * len(arr) # 正向遍历一遍,右边的分数大就加一 for i in range(1, len(arr)): if arr[i] > arr[i-1]: k[i] = k[i-1] + 1 count = k[len(arr)-1] # 从右往左遍历,左边分数大于右边的更新糖果数 for i in range(len(arr)-2, -1, -1): if arr[i] > arr[i+1]: # 取max就好 k[i] = max(k[i], k[i+1]+1) count += k[i] return count
class Solution: def candy(self , arr: List[int]) -> int: l = len(arr)-1 res =[1]* len(arr) for i in range(1,len(arr)): if arr[i]>arr[i-1]: res[i] = res[i-1]+1 while l : if arr[l-1] > arr[l]: res [l-1] = max(res[l]+1,res[l-1]) l -= 1 return sum(res)
class Solution: def candy(self , arr: List[int]) -> int: #记录每个位置的糖果数,初始为1 n=len(arr) nums = [1] * n #从左到右遍历,遍历结束之后糖果数递增 for i in range(1,n): if arr[i]> arr[i-1]: nums[i]=nums[i-1]+1 #从右向左遍历,右边大 for i in range(n-2,-1,-1):#倒数第2个开始 #得分比人家少,但是糖果数比人家多,这就不行 if arr[i]> arr[i+1] and nums[i]<= nums[i+1]: nums[i]=nums[i+1]+1 res=sum(nums) return res
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # pick candy # @param arr int整型一维数组 the array # @return int整型 class Solution: def candy(self , arr: List[int]) -> int: # write code here candyarr = [1] * (len(arr)) # 从左到右 for i in range(1, len(arr)): if arr[i] > arr[i-1]: ## 比较 当前得分和左侧得分 candyarr[i] = candyarr[i-1] + 1 # 从右到左 for j in range(len(arr)-2, -1, -1): if arr[j] > arr[j+1]: ## 比较 当前得分和右侧得分 candyarr[j] = max(candyarr[j], candyarr[j+1]+1) return sum(candyarr)
class Solution: def candy(self , arr: List[int]) -> int: nums = [1] * len(arr) for i in range(1, len(arr)): if arr[i] > arr[i-1]: nums[i] = nums[i-1] + 1 res = nums[len(arr)-1] i = len(arr) - 2 while i >= 0: if arr[i] > arr[i+1] and nums[i] <= nums[i+1]: nums[i] = nums[i+1] + 1 res += nums[i] i -= 1 return res
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # pick candy # @param arr int整型一维数组 the array # @return int整型 # class Solution: def candy(self , arr: List[int]) -> int: # write code here n = len(arr) candy = [1 for i in range(n)] for i in range(n-1): if arr[i] < arr[i+1]: candy[i+1] = candy[i] + 1 for i in range(n-1, 0, -1): if arr[i] < arr[i-1]: candy[i-1] = max(candy[i-1], candy[i] + 1) return sum(candy)