【LeetCode】NO.135 分发糖果 (C++ & Python) [贪心算法]
题目
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