力扣135. 分发糖果

题目来源(力扣):

https://leetcode.cn/problems/candy/

题目描述:

给n个孩子发糖果。
孩子们排成一条链,每个孩子有一个分数rat,要求每个孩子至少得到一个糖果,且相邻的孩子中分数高的那一个得到的糖果必须更多
如果2个孩子的分数相同且他们相邻,则他们的糖果也需要满足一个高一个低。
求最少的糖果需求量。

基本思路:

经典贪心题目,也符合贪心“局部最优到全局最优”
分析题目要求,实际上需要满足:
(1)孩子i的分数高于i-1的孩子,则他得到的糖果数多于i-1的孩子;
(2)孩子i的分数高于i+1的孩子,则他得到的糖果数多于i+1的孩子。

在进行遍历时,应该先从前往后扫描ret数组,得到val数组,完成(1)的要求;
再从后往前扫描ret数组,更新val数组,完成(2)的要求。
不能一次性完成(1)(2),否则容易顾此失彼

由局部最优就能得到全局最优,即只要满足以上条件(1)(2),就完成了题目。
即满足(1)(2)就相当于满足了相邻的孩子中分数高的那一个得到的糖果必须更多的条件。

参考《代码随想录》,代码如下:

代码实现:

class Solution
{
public:
    int candy(vector<int> &ratings)
    {
        int len = ratings.size();
        vector<int> val(len, 1);
        // 从左往右
        for (int i = 1; i < len; i++)
        {
            if (ratings[i] > ratings[i - 1])
                val[i] = val[i - 1] + 1;
        }
        // 从右往左
        for (int i = len - 2; i >= 0; i--)
        {
            if (ratings[i] > ratings[i + 1])
                val[i] = max(val[i], val[i + 1] + 1);
        }
        // 累计答案
        int ans = 0;
        for (int i = 0; i < len; i++)
            ans += val[i];
        return ans;
    }
};

时间复杂度

O(n)

posted @ 2024-11-15 15:41  HB_Computer  阅读(50)  评论(0)    收藏  举报