135. 分发糖果
1. 题目
n
个孩子站成一排。给你一个整数数组 ratings
表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
- 每个孩子至少分配到
1
个糖果。 - 相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
示例 1:
1 | 输入:ratings = [1,0,2] |
示例 2:
1 | 输入:ratings = [1,2,2] |
提示:
n == ratings.length
1 <= n <= 2 * 104
0 <= ratings[i] <= 2 * 104
2. 思路
首先设立两个数组,分别为
L
和R
,这两个数组的含义和生成规则分别为以下:L数组:代表的是从左到右遍历
ratings
应当分配的糖果数量- 当
ratings[i] > ratings[i - 1]
时,L[i] = L[i - 1] + 1
,这里是为了应对相邻两个孩子评分更高的孩子会获得更多的糖果的题目要求 - 当
ratings[i] < ratings[i - 1]
时,L[i] = 1
,这里是为了应对每个孩子至少分配到1个糖果的题目要求
- 当
R数组:代表的是从右到左遍历
ratings
应当分配的糖果数量- 当
ratings[i] > ratings[i + 1]
时,R[i] = R[i + 1] + 1
,如上所述,为了应对相邻两个孩子评分更高的孩子会获得更多的糖果的题目要求 - 当
ratings[i] < ratings[i + 1]
时,R[i] = 1
,为了应对每个孩子至少分配到1个糖果的题目要求
- 当
当计算出
L
数组和R
数组后, 再次遍历同时采用变量count
逐步累加计算Math.max(L[i], R[i])
值,累加两个数组之间的最大值是因为左右规则都满足的情况下,小的值可能会破坏题目规则,而大的值可能不会破坏题目规则,比如:- 有且仅有当取
L[i]
和R[i]
两者的最大值时,才能得到最少需要分配的糖果数量
- 有且仅有当取
Tips: 这里补充一个疑问点就是为什么一定需要R数组,根据一个简单的例子
[1,2,3,2,1]
,生成的L数组为[1,2,3,1,1]
,如果没有R数组,则会导致下标3分配的糖果数量为1,此处不满足题目的第二个要求
3. 代码
1 | class Solution { |
4. 复杂度
- 时间复杂度:
O(n)
- 空间复杂度:
O(n)