【LeetCode】NO.135 分發糖果 (C++ & Python) [貪心演算法]
阿新 • • 發佈:2021-12-30
貪心演算法第六彈!!!
題目
n 個孩子站成一排。給你一個整數陣列 ratings 表示每個孩子的評分。
你需要按照以下要求,給這些孩子分發糖果:
每個孩子至少分配到 1 個糖果。
相鄰兩個孩子評分更高的孩子會獲得更多的糖果。
請你給每個孩子分發糖果,計算並返回需要準備的 最少糖果數目 。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/candy
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
思路
- 首先想到的是每次考慮左右,但是這樣又跟下一個產生聯絡,很難實現;
- 其次考慮從左到右保證右邊孩子大於左邊
在從後往前考慮左邊孩子要大於右邊 - 一開始初始化ans 為全1,保證每個孩子都有
從左到右索引從1開始,保證i-1取得到;直到遍歷完最後一個;
從右向左遍歷,要保證ratings[i+1]不越界,從len(ratings)-2,開始(-1是最後一個元素下標)到0(由於range()左閉右開,所以到0,每次-1)
程式碼
Python 版本:
class Solution: def candy(self, ratings: List[int]) -> int: li = [1]*len(ratings) for i in range(1,len(ratings)): if ratings[i]>ratings[i-1]: li[i] = li[i-1]+1 for i in range(len(ratings)-2,-1,-1): if ratings[i]>ratings[i+1]: li[i] = max(li[i],li[i+1]+1) return sum(li)
C++ 版本:
class Solution { public: int candy(vector<int>& ratings) { vector<int> ans(ratings.size(),1); int sum = 0; for(int i=1;i<ratings.size();i++) { if (ratings[i]>ratings[i-1]) { ans[i] = ans[i-1] + 1; } } for(int i=ratings.size()-2;i>=0;i--) { if (ratings[i]>ratings[i+1]) { ans[i] = max(ans[i],ans[i+1]+1); } } for(int i=0;i<ratings.size();i++) { sum += ans[i]; } return sum; } };
本文來自部落格園,作者:jucw,轉載請註明原文連結:https://www.cnblogs.com/Jucw/p/15738066.html