当前位置: 首页 > article >正文

【135. 分发糖果 困难】

题目:

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

思路:

由于每个孩子至少分配到 1 个糖果

先初始化一个vector,里面都填充为1。

代码如下:

vector<int> sumCandy(ratings.size(), 1);    //  每个孩子先分一个

相邻两个孩子评分更高的孩子会获得更多的糖果。

  • 需要先从前往后遍历,如果第i个孩子比第i - 1个孩子评分高,第i个孩子的糖果比第i - 1个多一个。

  • 然后再从后往前遍历,如果如果第i个孩子比第i + 1个孩子评分高,这个时候就有两个选择了,一个是sumCandy[i + 1] + 1(从右边这个加1得到的糖果数量),一个是sumCandy[i](之前比较右孩子大于左孩子得到的糖果数量)。

代码如下:

//  从前向后
for(int i = 1; i < ratings.size(); i++){
    if(ratings[i] > ratings[i - 1]){
        sumCandy[i] = sumCandy[i - 1] + 1;
    }
}
//  从后向前
for(int i = ratings.size() - 2; i >= 0; i--){
    if(ratings[i] > ratings[i + 1]){
        sumCandy[i] = max(sumCandy[i + 1] + 1, sumCandy[i]);
    }
}

统计sumCandy中的糖果总和

代码如下:

//  统计结果
for(auto i : sumCandy){
    result += i;
}

代码:

class Solution {
public:
    int candy(vector<int>& ratings) {
        int result = 0;
        vector<int> sumCandy(ratings.size(), 1);    //  每个孩子先分一个

        //  从前向后
        for(int i = 1; i < ratings.size(); i++){
            if(ratings[i] > ratings[i - 1]){
                sumCandy[i] = sumCandy[i - 1] + 1;
            }
        }
        //  从后向前
        for(int i = ratings.size() - 2; i >= 0; i--){
            if(ratings[i] > ratings[i + 1]){
                sumCandy[i] = max(sumCandy[i + 1] + 1, sumCandy[i]);
            }
        }
        //  统计结果
        for(auto i : sumCandy){
            result += i;
        }
        return result;
    }
};

总结:

时间复杂度: O(n)
空间复杂度: O(n)

这在leetcode上是一道困难的题目,其难点就在于贪心的策略,如果在考虑局部的时候想两边兼顾,就会顾此失彼。

那么本题采用了两次贪心的策略:

一次是从左到右遍历,只比较右边孩子评分比左边大的情况。

一次是从右到左遍历,只比较左边孩子评分比右边大的情况。

这样从局部最优推出了全局最优,即:相邻的孩子中,评分高的孩子获得更多的糖果。


参考:

代码随想录


http://www.kler.cn/a/522512.html

相关文章:

  • Kmesh v1.0 正式发布
  • Spring事务和事务传播机制
  • LangGraph系列-1:用LangGraph构建简单聊天机器人
  • 14-6-3C++STL的list
  • 《STL基础之vector、list、deque》
  • 2218. 从栈中取出 K 个硬币的最大面值和
  • 关联传播和 Python 和 Scikit-learn 实现
  • LeetCode热题100(一)—— 1.两数之和
  • Autogen_core: Reflection
  • Nuxt:利用public-ip这个npm包来获取公网IP
  • C#字典Dictionary用法详解
  • TikTok 推出了一款 IDE,用于快速构建 AI 应用
  • leetcode 1750. 删除字符串两端相同字符后的最短长度
  • 双选会资料录入步骤
  • 什么是卷积神经网络?
  • linux实际中的常用命令
  • SQL Server约束
  • FPGA 使用 CLOCK_LOW_FANOUT 约束
  • 简易CPU设计入门:控制总线的剩余信号(二)
  • 双向链表在系统调度、游戏、文本编辑及组态方面的应用
  • 【llm对话系统】LLM 大模型Prompt 怎么写?
  • 2025多目标优化创新路径汇总
  • 快速生成2D卡通人物的AI工具:开启Live2D角色创作的新时代
  • SuperAGI - 构建、管理和运行 AI Agent
  • CAN总线数据采集与分析
  • React第二十六章(createPortal)