LeetCode第135题:分发糖果

LeetCode第135题的要求是分发糖果,给孩子们分配糖果,满足条件是:每个孩子至少一个糖果,评分高的孩子比旁边的孩子多分糖果。以下是解题代码:

public class Solution {
    public int candy(int[] ratings) {
        // 获取孩子的数量
        int n = ratings.length;
        // 如果孩子数量为0,直接返回0
        if (n == 0) return 0;

        // 创建一个数组来保存每个孩子得到的糖果数量,初始值为1
        int[] candies = new int[n];
        for (int i = 0; i < n; i++) {
            candies[i] = 1;
        }

        // 从左到右遍历,如果右边的孩子评分比左边高,右边的糖果数应比左边多1
        for (int i = 1; i < n; i++) {
            if (ratings[i] > ratings[i - 1]) {
                candies[i] = candies[i - 1] + 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 totalCandies = 0;
        for (int candy : candies) {
            totalCandies += candy;
        }

        // 返回总糖果数
        return totalCandies;
    }
}

这个代码的核心思想是两次遍历:

  1. 左到右遍历:确保每个孩子比左边评分低的孩子至少多一个糖果。
  2. 右到左遍历:确保每个孩子比右边评分低的孩子至少多一个糖果,同时保持不低于第一次遍历的结果。

这样就能满足题目的条件并找到最小的糖果分配数量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值