返回轨道
算法 · 2026-05-14 · 22 阅读

P201 分糖果

算法 22 阅读

信号摘要

难度:Hard · 时长:10:32 · leetcode 135 · lintcode 412

P201 分糖果

未对外公开播放权限
点击查看说明

描述

这个题目说的是,n 个小孩站成一条直线,每个小孩都有一个对应的评分。你要根据小孩的评分给他们发糖果,要求每个小孩至少要有一个糖果,并且评分较高的小孩要比相邻的小孩分到更多糖果。你要计算出,至少需要准备多少颗糖果,才能按要求完成分配。

比如说,给你的小孩评分数组是:

[3, 3, 1, 6, 4, 3]

你最少要给这 6 个小孩分配的糖果数量是:

[1, 2, 1, 3, 2, 1]

按照这种分配方法,就可以达到题目要求。因此最少要准备的糖果数量就是这个数组的和,也就是 10。

代码

public class AlgoCasts {

  // Time: O(n), Space: O(n)
  public int candy(int[] ratings) {
    if (ratings == null || ratings.length == 0) return 0;
    int n = ratings.length;
    int[] d = new int[n];
    d[0] = 1;
    for (int i = 1; i < n; ++i) {
      if (ratings[i] > ratings[i-1])
        d[i] = d[i-1] + 1;
      else
        d[i] = 1;
    }
    int sum = d[n-1];
    for (int i = n-2; i >= 0; --i) {
      if (ratings[i] > ratings[i+1])
        d[i] = Math.max(d[i], d[i+1] + 1);
      sum += d[i];
    }
    return sum;
  }

}

📡 通讯频道