刷刷刷 Day 34 | 135. 分发糖果
135. 分发糖果
LeetCode题目要求
n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
示例
输入:ratings = [1,0,2] 输出:5 解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。
解题思路
从左到右,如果右大于左,那么右边左多一个糖果,但此时能保证的是右大于左的情况
然后在从右刀座,如果右小于左,就再分配糖果,让左边的再+1,同时与原数量作对比,取大的。
本题通过局部最优,推出全局最优。需要两部走
上代码
class Solution { public int candy(int[] ratings) { int len = ratings.length; int[] candyCountArr = new int[len]; // 总共需要的数量 int candyTotal = 0; // 初始位置第一个至少个 1 个 candy candyCountArr[0] = 1; for (int i = 1; i < len; i++) { // 如果右边的大于左边的, if (ratings[i] > ratings[i-1]) { // 那么右边的比左边的要多1个 candyCountArr[i] = candyCountArr[i-1] + 1; } else { // 其他的一律默认给 1 个 candy candyCountArr[i] = 1; } } // 第二次遍历 处理右边小于左边的(左边大于右边), 从后遍历 for (int i = len - 2; i >= 0; i--) { // 如果左大于右 if (ratings[i] > ratings[i+1]) { // 从 candyCountArr[i+1] + 1, candyCountArr[i] 取大的, // 即 candyCountArr[i+1] 右侧小,那么左侧应该大于右侧,此时 +1 后就是左侧的值;但这时还要看新的值和原左侧的值,哪个个大,取大的 candyCountArr[i] = Math.max(candyCountArr[i+1] + 1, candyCountArr[i]); } } for (int i = 0; i < len; i++) { candyTotal += candyCountArr[i]; } return candyTotal; } }
附:学习资料链接
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了