【python/leetcode/135/Hard】Candy

版权声明:小明酱私有,私自转载要捶你小胸口哦~ https://blog.csdn.net/alicelmx/article/details/83312564

题目

https://leetcode.com/problems/candy/

基本思路

在这里插入图片描述
题目要求比其高的邻居要比本身的奖励多,那么最少也要多一个,所有我们可以找到所有的凹点,凹点如上三种情形。

找到所有的凹点后,我们就可以从凹点处开始向左右两个方向依次查找递增序列,其中每个高的都要比相邻的矮的多一个,比如1,2,5,4.我们找到凹点为1 和4,那么从1开始向左没有其他点,我们向右,依次得到2 比1高,2的糖果应该是1的基础上加1,为2, 5比2高,5的糖果是在2的基础上加1,为3。另一个凹点4, 向左,5比4高,5的糖果应该是在4的基础上加 1,为2,这时我们发现冲突了,从凹点1 开始,我们得到的5的糖果是3,但是从凹点 4 开始,我们得到的糖果数却为2 ,此时我们选择哪个呢?当然,如果要少的,当然是2,但是它却违反了题目中的限定条件,5如果为2 ,就不比2的糖果数多了,所以这时我们就应该选择最大的,这说明了什么呢?说明从左面开始向右到 5 得到的递增序列的长度大于从4开始向左到5得到的递增序列。也就是说,得到的糖果数的多少,取决于所构成的连续递增序列的长度。

实现代码

class Solution(object):
    def candy(self, ratings):
        """
        :type ratings: List[int]
        :rtype: int
        """
        if ratings == []:
            return 0
        num = len(ratings)
        candy = [1]*num
        
        for i in range(1,num):
            if ratings[i] > ratings[i-1]:
                candy[i] = candy[i-1] + 1
        
        for i in range(num-2,-1,-1):
            if ratings[i] > ratings[i+1] and candy[i] < candy[i+1]+1:
                candy[i] = candy[i+1]+1
        
        return sum(candy)
        
        
                

猜你喜欢

转载自blog.csdn.net/alicelmx/article/details/83312564
今日推荐