1. 程式人生 > >【python/leetcode/135/Hard】Candy

【python/leetcode/135/Hard】Candy

題目

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)