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;}
};

相关内容

热门资讯

海南自贸港首条第七航权客运航线... 在海南自由贸易港封关运作的关键节点,12月22日16时6分,哈萨克斯坦斯卡特航空执飞的“三亚-布拉格...
会议需求集中释放——云南共享国... 随着年度工作进入收官阶段,企业与机构的会议需求在年底集中释放。年终总结会、战略规划会、客户答谢会、合...
“雪兆丰年·乡聚陇原” 甘肃发... 央广网兰州12月22日消息(记者寇刚)“雪兆丰年·乡聚陇原”2025年甘肃乡村旅游品牌推广暨冬春季乡...
百年匠心传承 香飘黑土内外:东... 在东北的早餐摊、菜市场与宴席餐桌上,总有一道美食以温润的口感、浓郁的蛋香占据一席之地——这就是东北鸡...