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

每日算法练习:LeetCode 135. 分发糖果 ✅

大家好,我是你们的算法小伙伴。今天我们来练习一道经典的贪心算法题目 ——LeetCode 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 * 10^4
  • 0 <= ratings[i] <= 2 * 10^4

解题思路

核心约束拆解

我们需要同时满足两个方向的约束:

  1. 从左到右:如果ratings[i] > ratings[i-1],则candies[i] = candies[i-1] + 1
  2. 从右到左:如果ratings[i] > ratings[i+1],则candies[i] = candies[i+1] + 1

贪心策略:两次遍历

  1. 第一次遍历(左→右):先满足 “左边比我小,我要更多” 的约束,初始化每个孩子至少 1 颗糖果。
  2. 第二次遍历(右→左):再满足 “右边比我小,我要更多” 的约束,同时取两次遍历结果的最大值,保证同时满足两个方向的约束。
  3. 求和:将所有孩子的糖果数相加,得到最少总数。

代码实现

class Solution { public int candy(int[] ratings) { int n = ratings.length; int[] candies = new int[n]; // 每个孩子至少 1 颗糖果 Arrays.fill(candies, 1); // 第一次遍历:左 → 右 for (int i = 1; i < n; i++) { if (ratings[i] > ratings[i-1]) { candies[i] = candies[i-1] + 1; } } // 第二次遍历:右 → 左 for (int i = n-2; i >= 0; i--) { if (ratings[i] > ratings[i+1]) { // 取最大值,保证同时满足左右约束 candies[i] = Math.max(candies[i], candies[i+1] + 1); } } // 计算总和 int total = 0; for (int c : candies) { total += c; } return total; } }

代码详解(结合示例 1 模拟)

示例 1:ratings = [1,0,2]

第一步:初始化

candies = [1, 1, 1]

第二步:左→右遍历

  • i=1ratings[1]=0 < ratings[0]=1→ 不变化,candies = [1, 1, 1]
  • i=2ratings[2]=2 > ratings[1]=0candies[2] = 1+1=2candies = [1, 1, 2]

第三步:右→左遍历

  • i=1ratings[1]=0 < ratings[2]=2→ 不变化,candies = [1, 1, 2]
  • i=0ratings[0]=1 > ratings[1]=0candies[0] = max(1, 1+1)=2candies = [2, 1, 2]

第四步:求和

2 + 1 + 2 = 5,与示例结果一致。


复杂度分析

  • 时间复杂度:O (n),两次遍历数组,一次求和,共 O (3n) = O (n)。
  • 空间复杂度:O (n),需要额外数组candies存储每个孩子的糖果数。

总结

  1. 核心思想:通过两次遍历分别处理左右约束,最后取最大值,保证同时满足所有条件。
  2. 贪心本质:每次只关注当前方向的最优解,最终合并得到全局最优解。
  3. 易错点:第二次遍历时必须取max,否则会破坏第一次遍历已经满足的约束。

这道题是贪心算法中 “多方向约束” 的经典应用,理解两次遍历的逻辑,就能轻松解决这类问题。

今天的每日算法练习就到这里,我们明天再见!👋

http://www.jsqmd.com/news/526640/

相关文章:

  • OpenClaw 中 web_search + web_fetch 最佳实践速查表
  • wwwww
  • OpenCore Legacy Patcher:老Mac设备的系统兼容解决方案
  • NFS共享那些坑:从‘insecure参数‘到‘nolock选项‘的避坑指南(附CentOS8实测)
  • 手把手教你用Chainlink喂价:从零搭建一个DeFi借贷协议的清算触发器
  • POST请求提交数据的三种方式及通过Postman实现
  • 比迪丽模型Win10镜像部署优化:系统资源占用降低方案
  • PCB LDI设备行业痛点解析及解决方案应用
  • 【第四周】论文精读:GQR: Guided Query Refinement for Multimodal Hybrid Retrieval
  • 实测灵毓秀-牧神-造相Z-Turbo:如何写出有效的图片描述词
  • 解锁2026国内旅拍新体验,这些公司带你玩转浪漫,旅拍口碑分析精选优质厂家 - 品牌推荐师
  • 智慧工厂能源管理实战:IOT物联网能源监控SaaS系统平台如何实现空压机节能30%
  • **发散创新:Rust中的错误处理艺术 —— 从 Panic 到 Result 的优雅演进**在现代编程语
  • 造相-Z-Image文生图引擎:5分钟在RTX 4090上部署,小白也能玩转AI绘画
  • 比迪丽LoRA模型Typora文档美化实战:为技术笔记自动生成配图
  • 毕业设计实战:基于SpringBoot+Vue+MySQL的铁路订票管理系统设计与实现指南
  • RetinaFace在嵌入式Linux中的优化部署
  • 从Python到C的魔法解密:手把手教你逆向分析Cython生成的加密模块
  • 灵毓秀-牧神-造相Z-Turbo与ChatGPT协同创作方案
  • 定稿前必看!碾压级的降AIGC平台 —— 千笔·降AI率助手
  • ROS机械臂开发实战:MoveIt!配置中SRDF报错的5分钟修复指南
  • 华为昇腾 Atlas200DK 从零部署:系统烧录、环境配置与摄像头检测实战
  • 订阅号爆款逻辑,AI 写作 + 去 AI 味 + 真诚表达
  • OpenClaw技能推荐:GLM-4.7-Flash开发者必备的5个效率工具
  • 盲盒小程序开发|解锁开箱新体验[特殊字符]
  • 保姆级教程:用Python从零复现Pan-Tompkins算法(含MIT-BIH数据库验证)
  • 基于MATLAB的广义连续函数碰撞检测框架(CCD)在无人机运动规划中的应用
  • 能源化工下一站,可以投哪些ETF?富国农业ETF值得关注
  • RPA平台评估指南:从系统集成到流程稳定性
  • 毕业设计实战:基于SpringBoot+Vue+MySQL的健美操评分系统设计与实现指南