描述
一群孩子做游戏,现在请你根据游戏得分来发糖果,要求如下:
- 每个孩子不管得分多少,起码分到一个糖果。
- 任意两个相邻的孩子之间,得分较多的孩子必须拿多一些糖果。(若相同则无此限制)
给定一个数组 arrarr 代表得分数组,请返回最少需要多少糖果。
要求: 时间复杂度为 O(n)空间复杂度为 O(n)
数据范围:1≤n≤100000 , 1 ≤ a i ≤ 1000 1 \le a_i \le 1000 1≤ai≤1000
示例1
输入:[1,1,2]
返回值:4
说明:最优分配方案为1,1,2
示例2
输入:[1,1,1]
返回值:3
说明:最优分配方案是1,1,1
代码
class Solution {
public:
/**
* pick candy
* @param arr int整型vector the array
* @return int整型
*/
int candy(vector<int>& arr) {
// write code here
if(arr.size()==1)
return 1;
vector<int> dp(arr.size(),1);
int min=0;
for(int i=1;i<arr.size();i++){
if(arr[i]>arr[i-1])
dp[i]=dp[i-1]+1;
}
for(int i=arr.size()-2;i>=0;i--){
if(arr[i]>arr[i+1]&&dp[i]<=dp[i+1])
dp[i]=dp[i+1]+1;
}
for(auto iter=dp.begin();iter<dp.end();iter++){
min+=*iter;
}
return min;
}
};