NC130 分糖果问题(经典贪心算法问题)(适合两两比较问题)_贪心算法
描述
一群孩子做游戏,现在请你根据游戏得分来发糖果,要求如下:

  1. 每个孩子不管得分多少,起码分到一个糖果。
  2. 任意两个相邻的孩子之间,得分较多的孩子必须拿多一些糖果。(若相同则无此限制)

给定一个数组 arrarr 代表得分数组,请返回最少需要多少糖果。

要求: 时间复杂度为 O(n)空间复杂度为 O(n)

NC130 分糖果问题(经典贪心算法问题)(适合两两比较问题)_算法_02

示例1

输入:
[1,1,2]
返回值:
4
说明:
最优分配方案为1,1,2

示例2

输入:
[1,1,1]
返回值:
3
说明:
最优分配方案是1,1,1

Code:

//思路分析
//为使每个孩子都能得到一个糖因此,首先先给每个孩子一个糖果,
//接着直接使用循环遍历的办法,从左往右遍历,右边得分高的糖果数比左边孩子多一个。
//从右往左遍历,如果左边孩子分数高,并且左边孩子糖果数较小,则糖果数为左边孩子的加1。
//最后统计所有的糖果数量。
#include<numeric>
class Solution {
public:
/**
* pick candy
* @param arr int整型vector the array
* @return int整型
*/
int candy(vector<int>& arr) {
// write code here
vector<int>vec(arr.size(),1);

for(int i=0;i<arr.size()-1;i++)
{
if(arr[i]<arr[i+1])
{
vec[i+1]=vec[i]+1;
}
}
for(int i=arr.size()-1;i>0;i--)
{
if(arr[i-1]>arr[i] &&vec[i-1]<=vec[i])
{
vec[i-1]=vec[i]+1;
}
}
return accumulate(vec.begin(),vec.end(),0);

}
};