LeetCode 135 – 分发糖果

题目描述

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
相邻两个孩子中,评分更高的那个会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。

示例:
输入:ratings = [1,0,2]
输出:5

题目分析

贪心。
从左向右扫描一遍,ratings[i] > ratings[i-1] 时令 nums[i] = nums[i-1] + 1
再从右向左扫描一遍,ratings[i] > ratings[i+1] 时令 nums[i] >= nums[i+1] + 1

Java

public int candy(int[] ratings) {
    int[] nums = new int[ratings.length];
    for (int i = 0; i < ratings.length; i++) {
        nums[i] = 1;
        if (i - 1 >= 0 && ratings[i] > ratings[i - 1]) {
            nums[i] = nums[i - 1] + 1;
        }
    }
    int sum = 0;
    for (int i = ratings.length - 1; i >= 0; i--) {
        if (i + 1 < ratings.length && ratings[i] > ratings[i + 1]) {
            nums[i] = Math.max(nums[i], nums[i + 1] + 1);
        }
        sum += nums[i];
    }
    return sum;
}

Kotlin

fun candy(ratings: IntArray): Int {
    val nums = IntArray(ratings.size) { 1 }
    for (i in 1 until ratings.size) {
        if (ratings[i] > ratings[i - 1]) {
            nums[i] = nums[i - 1] + 1
        }
    }
    for (i in ratings.size - 2 downTo 0) {
        if (ratings[i] > ratings[i + 1]) {
            nums[i] = max(nums[i], nums[i + 1] + 1)
        }
    }

    return nums.sum()
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部