Description
There are N children standing in a line. Each child is assigned a rating value.
You are giving candies to these children subjected to the following requirements:
- Each child must have at least one candy.
- Children with a higher rating get more candies than their neighbors.
What is the minimum candies you must give?
Example 1:
Input: [1,0,2]
Output: 5
Explanation: You can allocate to the first, second and third child with 2, 1, 2 candies respectively.
Example 2:
Input: [1,2,2]
Output: 4
Explanation: You can allocate to the first, second and third child with 1, 2, 1 candies respectively.
The third child gets 1 candy because it satisfies the above two conditions.
分析
题目的意思是:现在给一群孩子分蛋糕,每个孩子有一个值,现在给孩子分蛋糕,要求每个孩子至少一个蛋糕,得分高的孩子得到的蛋糕必须比相邻的孩子高。
- 先定义一个技术vector,初始值都为1,然后从左到右,如果遇见当前的rating比前一个相邻的大,就nums[i]=nums[i-1]+1;
然后从右向左,如果遇见当前的rating比后面一个小,且nums[i]<=nums[i+1].求完后遍历求和就是最终的结果。 - 这种题目首先会把人带入动态规划(恐惧)的误区,感觉是不看答案做不出来,实现后发现并不是,我这里虚心学习一下。
代码
class Solution {
public:
int candy(vector<int>& ratings) {
int n=ratings.size();
vector<int> nums(n,1);
for(int i=0;i<n-1;i++){
if(ratings[i+1]>ratings[i]){
nums[i+1]=nums[i]+1;
}
}
for(int i=n-1;i>0;i--){
if(ratings[i-1]>ratings[i]){
nums[i-1]=max(nums[i-1],nums[i]+1);
}
}
int res=0;
for(int i=0;i<n;i++){
res+=nums[i];
}
return res;
}
};