题目要求
n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
示例 1:
输入:ratings = [1,0,2]
输出:5
解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。
示例 2:
输入:ratings = [1,2,2]
输出:4
解释:你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。
第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。
提示:
n == ratings.length
1 <= n <= 2 * 104
0 <= ratings[i] <= 2 * 104
其实这里我并不是很明白为什么对数组进行两次循环的判断就好了,这个代码不是我自己写的,我个人对这个代码进行分析是,刚开始当考虑只右侧的人比左侧的人多的情况,然后再从右往左考虑一遍,不明白是怎么想先到这个思路的,如果是遍历一遍数组的时候,当右边大于左边时,右侧+1,那么当右边不大于左边的话是不是左边可以进行一个+1操作,但是如果此时左边又进行了一次+1操作的话,那么左边的左边是否又需要进行变换,这样的话就牵扯到了所有前面的元素,所以先整体从左往右考虑一次,然后再从右往左遍历一次,这样子就可以避免那种连锁反应。
class Solution {
public:
int candy(vector<int>& r)
{
//如果先对数组进行循环判断,当右边的人比左边的高,那么糖果数就是左边的+1
//如果左边的更高,需不需要减一呢
int len = r.size();
//创建一个数组来记录每个位置上的人分别需要多少糖果,最后求和
vector<int>arr(len,1);
for(int i = 0;i<len-1;i++)
{
//如果左侧的人分数小于右侧的人,那么右侧的人糖果数+1
if(r[i]<r[i+1])
{
arr[i+1] = arr[i]+1;
}
}
for(int i = len-1;i>0;i--)
{
//从右往左判断,如果左侧的人分数高于右侧的人且此时左侧人的糖果数要少于右侧的人
//如果出现在左侧的人分数比右侧高,但是糖果数要多于右侧的人
//那么就表示这个人的糖果数不需要额外再加,因为同时满足多于两侧的人的糖果数
if(r[i-1]>r[i] && arr[i-1]<=arr[i])
{
arr[i-1] = arr[i]+1;
}
}
int count = 0;
for(int i = 0;i<len;i++)
{
count += arr[i];
// cout<<arr[i]<<" ";
}
return count;
}
};
以上代码纯属个人分析,如有好的思路或者想法,欢迎讨论交流