class Solution {
public:
int candy(vector<int>& ratings) {
}
};
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
原站题解
golang 解法, 执行用时: 28 ms, 内存消耗: 6.2 MB, 提交时间: 2020-11-18 20:35:42
func candy(ratings []int) int { n := len(ratings) s := n tmp := make([]int, n) for i := 1; i < n; i++ { if ratings[i-1] < ratings[i] { tmp[i] += tmp[i-1] + 1 } } for i := n-2; i > -1; i-- { if ratings[i] > ratings[i+1] { tmp[i] = max(tmp[i], tmp[i+1]+1) } } for _, i := range tmp { s += i } return s } func max(a, b int) int { if a > b { return a } return b }
python3 解法, 执行用时: 72 ms, 内存消耗: 15.4 MB, 提交时间: 2020-11-18 20:30:33
class Solution: def candy(self, ratings: List[int]) -> int: n = len(ratings) s = n tmp = [0] * n for i in range(1, n): if ratings[i-1] < ratings[i]: # 从左到右, 相邻的大的+1 tmp[i] = tmp[i-1] + 1 for i in range(n-2, -1, -1): # 从右到左, 相邻的大的调整 if ratings[i] > ratings[i+1]: tmp[i] = max(tmp[i], tmp[i+1]+1) s += sum(tmp) return s