leetcode2_135.分发糖果
leetcode学习算法之贪心算法:135.分发糖果
题目描述
n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
示例 :
输入:ratings = [1,0,2]
输出:5
解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。
代码
class Solution:def candy(self, ratings: List[int]) -> int:candy = [1 for i in range(len(ratings))]for i in range(1, len(ratings)):if ratings[i-1] < ratings[i]:candy[i] = candy[i-1] + 1for i in range(len(ratings)-1, 0, -1):if ratings[i] < ratings[i-1]:candy[i-1] = max(candy[i-1], candy[i] + 1)# print(candy)return sum(candy)
调用测试
ratings = [1,2,87,87,87,2,1]
# 创建 Solution 类的实例
solution = Solution()
# 调用方法
result = solution.candy(ratings)
# 输出结果
print("最多需要", result, "个糖果")
刚开始时在第一个for循环种使用: candy[i] += 1
在测试用例没用重复的得分时,运行结果正确,但是面对有重复紧挨的得分时,结果总是少1个,测试用例不正确。需要修改为:candy[i] = candy[i-1] + 1
首先不看解题思路,自己思考的思路是:先找到最小元素的值和位置,再分别从最小元素的位置向左右两边进行比较,分配糖果,但是这个只考虑了一个分享,没有考虑一个元素有两个相邻的值。
后面看了解题思路后,醍醐灌顶,算法真的很奇妙。
贪心算法中需要获得大小关系时,需要对计算的列表进行排序;
贪心算法中存在位置上的比较关系时,不一定要进行排序。