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

LeetCode 135:分糖果

LeetCode 135:分糖果

在这里插入图片描述

问题本质与核心挑战

给定孩子的评分数组,需满足 “每个孩子至少1颗糖果,相邻评分高的孩子糖果更多”,求最少糖果总数。核心挑战:

  • 相邻约束是双向的(左→右和右→左都需满足),直接枚举无法高效解决;
  • 需通过 两次贪心遍历(左→右、右→左)分别处理单向约束,再合并结果。

核心思路:双向贪心 + 合并约束

1. 单向约束处理(左→右遍历)
  • 定义数组 leftleft[i] 表示 从左到右遍历 时,第 i 个孩子应得的最少糖果(仅满足“左边约束”:若 ratings[i] > ratings[i-1],则 left[i] = left[i-1]+1;否则为 1)。
2. 单向约束处理(右→左遍历)
  • 定义数组 rightright[i] 表示 从右到左遍历 时,第 i 个孩子应得的最少糖果(仅满足“右边约束”:若 ratings[i] > ratings[i+1],则 right[i] = right[i+1]+1;否则为 1)。
3. 合并双向约束
  • 每个孩子最终的糖果数为 max(left[i], right[i])(同时满足左右约束),求和即为答案。

算法步骤详解(以示例 ratings = [1,0,2] 为例)

步骤 1:左→右遍历,处理左边约束
孩子索引 i评分 ratings[i]与左边比较(ratings[i] > ratings[i-1]left[i] 计算left 数组
01-(无左边孩子)初始为 1[1]
100 > 1?否设为 1[1,1]
222 > 0?是left[1]+1 = 2[1,1,2]
步骤 2:右→左遍历,处理右边约束
孩子索引 i评分 ratings[i]与右边比较(ratings[i] > ratings[i+1]right[i] 计算right 数组
22-(无右边孩子)初始为 1[1]
100 > 2?否设为 1[1,1]
011 > 0?是right[1]+1 = 2[2,1,1]
步骤 3:合并约束,计算总和
孩子索引 ileft[i]right[i]max(left[i], right[i])贡献糖果数
01222
11111
22122
总和---2+1+2=5

完整代码(Java)

class Solution {public int candy(int[] ratings) {int n = ratings.length;if (n == 0) return 0; // 边界处理(题目保证n≥1,可省略)// 1. 左→右遍历,处理左边约束int[] left = new int[n];left[0] = 1; // 第一个孩子至少1颗for (int i = 1; i < n; i++) {if (ratings[i] > ratings[i-1]) {left[i] = left[i-1] + 1;} else {left[i] = 1;}}// 2. 右→左遍历,处理右边约束int[] right = new int[n];right[n-1] = 1; // 最后一个孩子至少1颗for (int i = n-2; i >= 0; i--) {if (ratings[i] > ratings[i+1]) {right[i] = right[i+1] + 1;} else {right[i] = 1;}}// 3. 合并双向约束,计算总和int total = 0;for (int i = 0; i < n; i++) {total += Math.max(left[i], right[i]);}return total;}
}

关键逻辑解析

  1. 左→右遍历:确保 “右边孩子评分更高时,糖果数比左边多”,但无法处理“左边孩子评分更高,右边需更多”的情况(如 [5,4,3,2,1],左遍历后所有 left[i]=1,需右遍历修正)。
  2. 右→左遍历:确保 “左边孩子评分更高时,糖果数比右边多”,与左遍历互补。
  3. 合并约束:取两者最大值,保证同时满足左右双向约束,且糖果数最少(贪心思想:仅在必要时增加糖果)。

复杂度分析

  • 时间复杂度O(n)(两次遍历数组,每次 O(n),合并遍历 O(n))。
  • 空间复杂度O(n)(存储 leftright 数组,可优化为 O(1),但代码可读性降低)。

该方法通过 两次贪心遍历拆分双向约束,将复杂的双向问题转化为两个单向问题,再合并求解,确保了效率和可读性的平衡,是处理此类“双向约束”问题的经典思路。

http://www.dtcms.com/a/313998.html

相关文章:

  • Go语言 逃 逸 分 析
  • JVM学习专题(四)对象创建过程
  • 【软考中级网络工程师】知识点之 BGP 协议
  • PHP多人实时聊天室源码 简单易用
  • 电力改造的 “加速引擎”:边缘计算网关如何让智能电网升级效率翻倍?
  • Deep learning based descriptor
  • 复现论文《A Fiber Bragg Grating Sensor System for Train Axle Counting》
  • Centos7.9安装Oracle11.2.0.1版本问题处理
  • gRPC C++ 从 0 到 1 → 到线上:**超详细** 环境搭建、编码范式、性能调优与 DevOps 全攻略
  • weapp-tailwindcss 已支持 uni-app x 多端构建
  • 【笔记】ROS1|5 ARP攻击Turtlebot3汉堡Burger并解析移动报文【旧文转载】
  • (2023ICML)BLIP-2:使用冻结图像编码器和大语言模型引导语言-图像预训练
  • Druid学习笔记 02、快速使用Druid的SqlParser解析
  • 【目标检测基础】——yolo学习
  • uniapp基础(四)性能优化
  • BM1684X平台:Qwen-2-5-VL图像/视频识别应用
  • 从医学视角深度解析微软医学 Agent 服务 MAI-DxO
  • 深入解析 Apache Tomcat 配置文件
  • 2025.08.04 移除元素
  • 【分享】拼团交易平台系统,分布式、高并发、微服务
  • 算法128. 最长连续序列
  • 大型软件系统的主要指标是什么?
  • 电商直播流量爆发式增长,华为云分布式流量治理与算力调度服务的应用场景剖析
  • Win11 下解决 VScode/Trae 插件加载慢, 整个 VScode/Trae 很卡
  • 电脑忘记开机密码怎么办?【图文详解】5种方法重置/更改/取消/设置开机密码?
  • windows双系统下ubuntu20.04安装教程
  • [Oracle] || 连接运算符
  • iOS混淆工具有哪些?功能测试与质量保障兼顾的混淆策略
  • lodash的替代品es-toolkit详解
  • kubernets命令行创建Token并附加权限给dashboard控制台登录