题目描述:
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
思路:
依题意:“相邻两个孩子评分更高的孩子会获得更多的糖果”。我们可以把这个条件拆分为左相邻和右相邻。
先从左边遍历一次,如果ratings[i]>ratings[i-1],那么第i个小孩的糖果比i-1个小孩多一个,否则这个小孩糖果数量为1。用一个left数组记录从左边遍历时第i个小孩的最小糖果数量。那么这个逻辑可以表示为if(ratings[i]>ratings[i-1])left[i]=left[i-1]+1;else left=1;
然后从右往左遍历进行一次同样的操作,用right记录。
代码如下:
public class Solution {
public int Candy(int[] ratings) {
int ans=0;//答案
int n=ratings.Length;
int[] left=new int[n];//left表示从左往右遍历时第i个小孩的最少糖果数
for(int i=0;i<n;i++){
if(i>0&&ratings[i]>ratings[i-1]){
left[i]=left[i-1]+1;
}
else{
left[i]=1;
}
}
int right=0;//这里可以只使用一个整型变量来存储,每一次循环进行判断
for(int i=n-1;i>=0;i--){
if(i<n-1&&ratings[i]>ratings[i+1]){
right++;
}
else{
right=1;
}
ans+=Math.Max(right,left[i]);
}
return ans;
}
}
我这里right使用一个整型变量而非数组,是考虑到了第二次遍历可以直接得出答案了,就没必要把每一个位置的right存下来。
标签:分发,right,ratings,C#,孩子,int,LeetCode135,糖果,left From: https://blog.csdn.net/m0_74081230/article/details/142288029