题目:老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。帮助老师给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
评分更高的孩子必须比他两侧的邻位孩子获得更多的糖果。
那么这样下来,老师至少需要准备多少颗糖果呢?
思路:例: 5 7 8 3 4 2 1
分析:评分高的孩子必须比他两侧的邻位孩子更多的糖果,如
nums[i-1]< nums[i]>nums[i-1] 对应的 candys[i-1]< candys[i]>candys[i-1]
则可以分为两种情况:
左→右规则 nums[i-1]< nums[i] 要求: candys[i-1] < candys[i]
如果candys[i-1] > candys[i],则candys[i] = candys[i-1] + 1
右→左规则 nums[i+1]<nums[i] candys[i+1] < candys[i]
如果candys[i+1] > candys[i],则candys[i] = candys[i+1] + 1
① 所有的孩子均满足上述条件,可以先循环满足左→右规则
② 所有的孩子均满足上述条件,再循环满足右→左规则
复杂度: 时间复杂度 O(n) 空间复杂度 O(n)
代码:
def candy(nums):
n = len(nums)
candys = [1] * n
for i in range(1, n):
if nums[i] > nums[i - 1]:
candys[i] = candys[i - 1] + 1
for i in range(n - 2, -1, -1):
if nums[i] > nums[i + 1] and candys[i] <= candys[i + 1]:
candys[i] = candys[i + 1] + 1
return sum(candys)
nums = [1, 0, 2]
print(candy(nums))