news 2026/7/29 21:36:32

JAVA练习367- 分发糖果

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JAVA练习367- 分发糖果

题目概览

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

来源:135. 分发糖果 - 力扣(LeetCode)

解题分析

方法:两次遍历

本题的核心要求是:每个孩子至少 1 颗糖,且相邻孩子中评分更高的必须获得更多糖果。为了用最少的糖果满足这两个条件,我们可以采用「两次遍历」的策略,分别处理从左到右和从右到左的递增关系。

思路解析

如果只考虑「左邻居」,规则很简单:

同理,如果只考虑「右邻居」:

但题目要求同时满足左右两边的约束,因此每个孩子最终的糖果数应取上述两个方向计算结果的最大值,这样才能同时保证比左边高时足够多、比右边高时也足够多。

算法步骤

  1. 第一次遍历(从左到右):初始化数组left,令left[0] = 1。遍历i = 1 → n-1
    • ratings[i] > ratings[i-1],则left[i] = left[i-1] + 1(保证比左边多)。
    • 否则,left[i] = 1(先给最少,右边遍历时会再调整)。
  2. 第二次遍历(从右到左):初始化变量right = 1(最后一个孩子的右向糖果数),总糖果数sum = left[n-1]。遍历i = n-2 → 0
    • ratings[i] > ratings[i+1],则right = right + 1(保证比右边多)。
    • 否则,right = 1(重置为最少)。
    • 此时当前孩子应得的糖果数为max(left[i], right),将其累加到sum
  3. 返回sum

代码实现(Java)

class Solution { public int candy(int[] ratings) { int n = ratings.length; int[] left = new int[n]; // 从左到右遍历 left[0] = 1; for (int i = 1; i < n; i++) { if (ratings[i] > ratings[i - 1]) { left[i] = left[i - 1] + 1; } else { left[i] = 1; } } // 从右到左遍历并累加 int right = 1; int sum = left[n - 1]; // 最后一个孩子的糖果数 for (int i = n - 2; i >= 0; i--) { if (ratings[i] > ratings[i + 1]) { right++; } else { right = 1; } sum += Math.max(left[i], right); } return sum; } }

复杂度分析

示例推演

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

  1. 左向遍历得left = [1,1,2]
  2. 右向遍历时:
    • i=2(评分 2):right=1sum=left[2]=2
    • i=1(评分 0):因为 0 > 2?否,right=1max(left[1]=1, right=1)=1sum=2+1=3
    • i=0(评分 1):因为 1 > 0?是,right=2max(left[0]=1, right=2)=2sum=3+2=5
  3. 最终结果 5,与题目输出一致。

该方法保证了每个孩子既满足左邻约束(通过left数组),又满足右邻约束(通过动态的right变量),且取最大值后即为满足双边条件的最小糖果数。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/29 21:31:00

提升用户体验:ShareLoginLib分享功能的优化策略与性能调优

提升用户体验&#xff1a;ShareLoginLib分享功能的优化策略与性能调优 【免费下载链接】ShareLoginLib ThirdParty login and share lib 项目地址: https://gitcode.com/gh_mirrors/sh/ShareLoginLib ShareLoginLib是一个专注于第三方登录和分享功能的Android库&#xf…

作者头像 李华
网站建设 2026/7/29 21:30:07

为什么选择Chocola?6大理由让它成为你的Android音乐首选

为什么选择Chocola&#xff1f;6大理由让它成为你的Android音乐首选 【免费下载链接】Chocola &#x1f36b; Chocola is a cute and powerful offline music player for Android! 项目地址: https://gitcode.com/gh_mirrors/cu/Chocola 在如今音乐流媒体主导的时代&…

作者头像 李华
网站建设 2026/7/29 21:29:24

富文本编辑器内核:Slate 与 ProseMirror 的文档模型及协同机制

富文本编辑器内核&#xff1a;Slate 与 ProseMirror 的文档模型及协同机制 一、contenteditable 的陷阱&#xff1a;为什么富文本编辑器需要自建文档模型 去年我们给一个协作文档产品做内核升级&#xff0c;原方案直接基于 contenteditable&#xff0c;上线三个月 bug 单堆到两…

作者头像 李华