class Solution:
def candy(self, ratings: List[int]) -> int:
n=len(ratings)
candyval=[1]*n
for i in range(1,n):
if ratings[i]>ratings[i-1]:
candyval[i]=candyval[i-1]+1
for i in range(n-2,-1,-1):
if ratings[i]>ratings[i+1]:
candyval[i]=max(candyval[i],candyval[i+1]+1)
return sum(candyval)
'''贪心算法要分成两部分去做,第一次从左向右满足两个条件,第二次从右向左满足两个条件,从右向左的时候
要取第一次和第二次得到结果更大的那一个,否则从右向左的两个条件无法满足。写个例子就知道了
第一次给的糖是candyval[i],第二次给的是candyval[i+1]+1,比较哪一个比较大,取最大的才能满足两次的要求'''
class Solution:
def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
people.sort(key=lambda x:(-x[0],x[1]))#按第一元素降序,第二元素升序的方式排列。
res=[]#用来储存最后结果。
for person in people:#对于排序后的people
if person[1]>len(res):#如果他对应的list[1]大于长度,说明它应该被放置在最后。
res.append(person)
else:#如果person对应的索引在res长度内,我们就需要按照这个索引把person插入到res中索引位置。
#原位置上的person要往后去。
res.insert(person[1],person)
return res
'''和分发糖果类似。二维贪心,要确定一个之后,再考虑另一个。这题按第一元素降序,第二元素升序的方式排列。
第一元素降序可以保证,在某个元素之前的元素个数,就是比它高的人的个数。因此,我们可以根据这个个数,按照索引
与res长度的比较,不停的加入或者插入。直到把people中的所有person都添加进去,结束。'''
class Solution: def candy(self, ratings: List[int]) -> int: n=len(ratings) candyval=[1]*n for i in range(1,n): if ratings[i]>ratings[i-1]: candyval[i]=candyval[i-1]+1 for i in range(n-2.