Featured image of post 135. 分发糖果

135. 分发糖果

题目描述

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 * 104
  • 0 <= ratings[i] <= 2 * 104

解法一:两次遍历

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
func max(nums ...int) int {
    ans := nums[0]
    for i := 1; i < len(nums); i++ {
        if nums[i] > ans {
            ans = nums[i]
        }
    }
    return ans
}

func candy(ratings []int) int {
    n := len(ratings)
    left := make([]int, n)
    left[0] = 1
    for i := 1; i < n; i++ {
        if ratings[i] > ratings[i-1] {
            left[i] = left[i-1] + 1
        } else {
            left[i] = 1
        }
    }
    // ans is initially left[n-1] instead of 1
    right, ans := 1, left[n-1]
    for i := n - 2; i >= 0; i-- {
        if ratings[i] > ratings[i+1] {
            right++
        } else {
            right = 1
        }
        ans += max(right, left[i])
    }
    return ans
}
Licensed under CC BY-NC-SA 4.0
最后更新于 2023/05/17 22:12:16
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计