leetcode 困难 —— 分发糖果(简单逻辑)

题目:
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<int>& 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;
    }
};

猜你喜欢

转载自blog.csdn.net/m0_52212261/article/details/129567041