当前位置: 面试刷题>> 分发糖果(经典算法150题)


题目描述

分发糖果

在一所小学里,老师准备了一些糖果要分发给班上的学生。为了公平起见,老师决定根据每个学生的表现来分配糖果数量。规则如下:

  1. 相邻规则:如果某个学生A的表现比相邻的学生B好,那么学生A应该得到比学生B更多的糖果。
  2. 从左到右遍历:首先从左到右遍历学生,确保每个学生至少得到比左边学生多的糖果(如果左边有学生且表现不如他)。
  3. 从右到左遍历:然后再从右到左遍历,确保每个学生得到的糖果数量也满足比右边学生多(如果右边有学生且表现不如他)的条件。

给定一个数组ratings,其中ratings[i]代表第i个学生的表现评分。请编写一个函数distributeCandies来计算并返回老师至少需要准备的糖果总数,以满足上述规则。

示例

输入:ratings = [1, 0, 2] 输出:5 解释:第一个学生得到1个糖果,第二个学生得到0个糖果,第三个学生得到4个糖果,因为第二个学生的评分低于其他两个学生。

PHP 代码示例

function distributeCandies($ratings) {
    $n = count($ratings);
    $candies = array_fill(0, $n, 1); // 每个学生至少有一个糖果

    // 从左到右遍历
    for ($i = 1; $i < $n; $i++) {
        if ($ratings[$i] > $ratings[$i - 1]) {
            $candies[$i] = $candies[$i - 1] + 1;
        }
    }

    // 从右到左遍历
    for ($i = $n - 2; $i >= 0; $i--) {
        if ($ratings[$i] > $ratings[$i + 1] && $candies[$i] <= $candies[$i + 1]) {
            $candies[$i] = $candies[$i + 1] + 1;
        }
    }

    // 计算总糖果数
    return array_sum($candies);
}

// 示例用法
$ratings = [1, 0, 2];
echo distributeCandies($ratings); // 输出 5

Python 代码示例

def distributeCandies(ratings):
    n = len(ratings)
    candies = [1] * n  # 每个学生至少有一个糖果

    # 从左到右遍历
    for i in range(1, n):
        if ratings[i] > ratings[i - 1]:
            candies[i] = candies[i - 1] + 1

    # 从右到左遍历
    for i in range(n - 2, -1, -1):
        if ratings[i] > ratings[i + 1] and candies[i] <= candies[i + 1]:
            candies[i] = candies[i + 1] + 1

    # 计算总糖果数
    return sum(candies)

# 示例用法
ratings = [1, 0, 2]
print(distributeCandies(ratings))  # 输出 5

JavaScript 代码示例

function distributeCandies(ratings) {
    const n = ratings.length;
    const candies = new Array(n).fill(1); // 每个学生至少有一个糖果

    // 从左到右遍历
    for (let i = 1; i < n; i++) {
        if (ratings[i] > ratings[i - 1]) {
            candies[i] = candies[i - 1] + 1;
        }
    }

    // 从右到左遍历
    for (let i = n - 2; i >= 0; i--) {
        if (ratings[i] > ratings[i + 1] && candies[i] <= candies[i + 1]) {
            candies[i] = candies[i + 1] + 1;
        }
    }

    // 计算总糖果数
    return candies.reduce((sum, candy) => sum + candy, 0);
}

// 示例用法
const ratings = [1, 0, 2];
console.log(distributeCandies(ratings)); // 输出 5

以上代码实现了分发糖果的算法,并符合题目要求。这些代码示例可以在实际面试或算法练习中使用,并可根据需要进行调整和优化。

推荐面试题