【贪心算法】135. 分发糖果
解题思想
贪心思想:两次遍历即可,先将所有孩子的糖果数初始化1,然后从左往右遍历一遍,如果右边的孩子评分比左边孩子的评分高,那么右边孩子的糖果数更新为左边孩子的糖果数加一,然后再从右往左遍历一遍,如果左边的孩子评分比右边的高,且左边孩子的糖果数不大于右边孩子的糖果数,则左边孩子的糖果数加一。
解题代码
class Solution {
public:
int candy(vector<int>& ratings) {
int size = ratings.size();
if(size <= 1)
{
return 1;
}
vector<int> num(size,1);// 根据这个size 新开辟一个数组 数组每一个元素都初始化1
// 先从左往右遍历
for(int i = 1; i < size; i++)
{
// 如果右边的评分高于左边的评分 那么加一
if(ratings[i] > ratings[i - 1])
{
num[i] = num[i - 1] + 1; // 比他左边的糖果数加一
}
}
// 从右往左遍历
for(int i = size - 1; i >=1; i--)
{
// 左边的分数比右边的要高 并且左边孩子的糖果数不大于右边孩子的糖果数
if(ratings[i] < ratings[i - 1] && num[i-1] <= num[i])
{
num[i - 1] = num[i] + 1;
}
}
return accumulate(num.begin(),num.end(),0);// 数组元素求和
}
};