leetcode135题:Candy
老师想给孩子们发糖果,有 N 个孩子站成了一条直线,老师根据每一个孩子的表现情况,会预先给他们每个人都打好评分。
你要按照以下要求帮助老师给这些孩子分发糖果:
每个孩子都至少应该有1个糖果。
相邻的孩子中,评分高的孩子必须获得更多的糖果。
那么这样下来,至少需要准备多少颗糖果呢?
- 思路:candies列表是每个小朋友得到的糖果数。我们首先从左往右遍历,给candies列表赋初值,如果当前小朋友的分数比前1位小朋友的高,则分给当前小朋友的糖果数=前1位小朋友的糖果数+1,否则当前小朋友的糖果数=1(满足每个孩子至少有1颗糖)。然后,再从右到左遍历,需要再比较当前小朋友和后1位小朋友的分数,因此,但此时,由于我们已经给candies列表赋过初值,即如果满足当前小朋友的分数比后一位小朋友高时,当前小朋友的糖果数也比后一位小朋友的糖果数高时,则说明原始candies列表满足条件,否则需要修改当前小朋友的糖果为后一位小朋友的糖果数+1。
class Solution:
#使用贪心算法
def candy(self, ratings):
"""
:type ratings: List[int]
:rtype: int
"""
n = len(ratings)
if n==0:
return 0
candies = [0]*n
#先从左向右遍历,初步给每位小朋友赋糖果初值
for i in range(n):
if i==0:
candies[i]=1
else:
if ratings[i]>ratings[i-1]:
candies[i] = candies[i-1]+1
else:
candies[i] = 1
for i in range(n-1,-1,-1):
if i==n-1:
continue
else:
if ratings[i]>ratings[i+1]:
candies[i] = max(candies[i],candies[i+1]+1)
else:
continue
res = sum(candies)
return res