题目:分发糖果
n
个孩子站成一排。给你一个整数数组 ratings
表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
- 每个孩子至少分配到
1
个糖果。 - 相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
思路:当前位置分配多少糖果,只依赖它的左右的取值,从左到右遍历,计算满足左侧要求需要的糖果,从右向左遍历,计算满足右侧要求需要的糖果,然后2个值取最大,即为既满足左侧也满足右侧需要的最少糖果数。
代码:
class Solution:
def candy(self, ratings: List[int]) -> int:
left_to_right = [1] * len(ratings)
for i in range(1, len(ratings)):
if ratings[i] > ratings[i - 1]:
left_to_right[i] = left_to_right[i - 1] + 1
# print(left_to_right)
right_to_left = [1] * len(ratings)
for j in range(len(ratings) - 2, -1, -1):
if ratings[j] > ratings[j + 1]:
right_to_left[j] = right_to_left[j + 1] + 1
# print(right_to_left)
candys_result = []
for i in range(len(ratings)):
candys_result.append(max(left_to_right[i], right_to_left[i]))
return sum(candys_result)