简单来说就是在限制值的基础上找期望值。
描述
一群孩子做游戏,现在请你根据游戏得分来发糖果,要求如下:
1. 每个孩子不管得分多少,起码分到一个糖果。
2. 任意两个相邻的孩子之间,得分较多的孩子必须拿多一些糖果。(若相同则无此限制)
给定一个数组 arrarr 代表得分数组,请返回最少需要多少糖果。
要求: 时间复杂度为 O(n)O(n) 空间复杂度为 O(n)O(n)
数据范围: 1≤n≤1000001≤n≤100000 ,1≤ai≤10001≤ai≤1000
class Solution {
public:
int candy(vector<int>& arr) {
// write code here
vector<int> nums(arr.size(),1);
//从左到右遍历
for(int i=1;i<arr.size();i++)
{
//如果右边在递增,每次增加一个
if(arr[i]>arr[i-1])
nums[i]=nums[i-1]+1;
}
//记录总糖果数
int res=nums[arr.size()-1];//先给最后一个的值,再从后往前遍历一遍,累加
//从右到左遍历
for(int i=arr.size()-2;i>=0;i--)
{
//如果左边更大但是糖果数更小
if(arr[i]>arr[i+1]&&nums[i]<=nums[i+1])
{
nums[i]=nums[i+1]+1;
}
//累加和
res+=nums[i];
}
return res;
}
};
总结:本身不难,难的是思路