【LeetCode】貪心演算法–分發糖果(135)

AhabWang發表於2019-02-16

今日題目

老師想給孩子們分發糖果,有N個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。
你需要按照以下要求,幫助老師給這些孩子分發糖果:
每個孩子至少分配到 1 個糖果。相鄰的孩子中,評分高的孩子必須獲得更多的糖果。那麼這樣下來,老師至少需要準備多少顆糖果呢?

示例 1:
輸入: [1,0,2]
輸出: 5
解釋: 你可以分別給這三個孩子分發 2、1、2 顆糖果。
示例 2:
輸入: [1,2,2]
輸出: 4
解釋: 你可以分別給這三個孩子分發 1、2、1 顆糖果。第三個孩子只得到 1 顆糖果,這已滿足上述兩個條件。

題目分析

對於這個問題,主要的條件是要相鄰孩子,得分高的拿的糖果要多(不包括相等得分),還有就是每個人最少都要有一個。
解決這個問題我們還是採用貪心演算法,首先初始化每個人分配的糖果數量都是1,然後這個演算法需要遍歷兩遍,第一遍從左往右遍歷,如果當前孩子的分數大於前一個孩子的分數,則當前孩子得到的糖果在前一個孩子的基礎上加1;然後,第二遍從右往左遍歷,如果當前孩子的分數大於他右邊孩子的分數,並且他的糖果不比他右邊孩子多,則糖果數在他基礎上加1;最後,將所有孩子的糖果數相加即可。
第二次遍歷是為了處理陣列中降序和有出現相鄰孩子分數相同的情況。

程式碼實現

class Solution:

def candy(self, ratings):
   """
   :type ratings: List[int]
   :rtype: int
    """
   num = [1]*len(ratings)
   for i in range(0,len(ratings)-1):
   if ratings[i+1] > ratings[i]:
       num[i+1] = num[i] + 1     
   for i in range(len(ratings)-1,0,-1):
       if ratings[i] < ratings[i-1]:
           num[i-1] = max(num[i]+1,num[i-1])

   return sum(num)


寫在最後

寒假已經跟一個小夥伴商量好一起刷題,感興趣的小夥伴也可以加入我們,希望大家每天可以交流刷題的心得,為了保證質量我會控制人數,大約在12人左右。

推薦閱讀:
Python騷操作 | 用Python來P圖

相關文章