leetcode 困难 —— 分发糖果(简单逻辑)
创始人
2025-05-28 16:11:24

题目:
n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。

题解:
这道题的本质,就是

如果有一串上升的评分,那么糖果就是 1 2 3 4 5 …
如果有一串下降的评分,那么糖果就是 n n-1 n-2 n-3 …
如果有一串相同的评分,那么糖果是 n 1 … 1 m(两侧的不一定是 1)

是不是所有组成都是这样呢
比如 1 2 4 3 2 1,那么就是由 1 2 4 和 4 3 2 1 两串数值组成

但是我们碰到下降的评分会很头疼,因为我们不知道这一串下降的有几个
所以我们不能在一次遍历的时候,确定评分为 4 的小朋友得到几个糖果
他应该得到的糖果为 1 2 4 和 4 3 2 1 两串的组成数的最大值

既然我们碰到下降的会很头疼
那么,我们把这串,从后往前遍历,是不是看起来就是上升的评分
那么我们把这个 1 2 4 得到的 3,和 1 2 3 4(4 3 2 1 从后往前遍历)得到的 4,取最大值即可
所以评分为 4 的那个小朋友得到了 4 个糖果

所以我们只要将评分从前到后遍历一次,再从后往前遍历一次
即可得到每个孩子获得的糖果

代码如下:

class Solution {
public:int flag[20005];int res = 0;int candy(vector& ratings) {flag[0] = 1;for(int i = 1; i < ratings.size(); i++) {if(ratings[i] > ratings[i - 1]) {flag[i] = flag[i - 1] + 1;}else {flag[i] = 1;}}flag[ratings.size() - 1] = max(1, flag[ratings.size() - 1]);for(int i = ratings.size() - 2; i >= 0; i--) {if(ratings[i] > ratings[i + 1]) {flag[i] = max(flag[i + 1] + 1, flag[i]);}else {flag[i] = max(1, flag[i]);}}for(int i = 0; i < ratings.size(); i++) {res = res + flag[i];}return res;}
};

相关内容

热门资讯

【黄山记忆工程口述档案专题】徽... 1月23日、28日,市档案馆、市非遗保护中心口述档案采集小组,两次采访资深级中国徽菜大师、安徽省劳动...
正阳县:手工馓子“云端”飘香 ... 全媒体记者 马军领 李京帆 通讯员 贺永明 李坤 随着春节临近,正阳县的传统手工食品成为抢手货,搭乘...