leetcode135(双向贪心)406

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都添加进去,结束。'''



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值