135. 分发糖果
题目
我们先找从左到右满足最少的糖果,再找从右到左的,最后取两边都满足的值(就是最大值)。
在两次扫描中,如何判断 i 位置需要多少糖果,我们需要处理有两种情况:
1.ratings[i - 1] < ratings[i],那么我们只需要比前一个多一块糖果
2.其他:我们只需要一块糖果
class Solution:
def candy(self, ratings: List[int]) -> int:
n = len(ratings)
if n == 0: return 0
left_to_right = [1] * n
right_to_left = [1] * n
# 找从左到右满足条件的
for i in range(1, n):
if ratings[i] > ratings[i - 1]:
# 保证从左到右的最少个数
left_to_right[i] = left_to_right[i - 1] + 1
# print(left_to_right)
# 找从右到左满足条件的(同时要符合从左到右)
for i in range(n - 2, -1, -1):
if ratings[i] > ratings[i + 1]:
# 保证从左到右也满足, 同时也满足从右到左
right_to_left[i] = max(left_to_right[i], right_to_left[i + 1] + 1)
# print(right_to_left)
res = 0
# 选这个位置最大值
for i in range(n):
res += max(left_to_right[i], right_to_left[i])
return res