【python/leetcode/135/Hard】Candy
阿新 • • 發佈:2018-11-03
題目
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)