力扣135. 分发糖果#
数学解法#
- r_i:第 i 个孩子评分
- x_i:第 i 个孩子分到糖果
- L_i:从左往右遍历,满足右边 > 左边评分的最少糖果
- R_i:从右往左遍历,满足左边 > 右边评分的最少糖果
- S:糖果总数
计算公式#
x_i = \max(L_i, R_i), \quad S=\sum x_i
代码实现#
def candy(ratings):
n = len(ratings)
L = [1] * n # L_i:左遍历数组
R = [1] * n # R_i:右遍历数组
# 左→右算L
for i in range(1, n):
if ratings[i] > ratings[i-1]:
L[i] = L[i-1] + 1
# 右→左算R
for i in range(n-2, -1, -1):
if ratings[i] > ratings[i+1]:
R[i] = R[i+1] + 1
# x_i = max(L_i,R_i),求和S
total = sum(max(L[i], R[i]) for i in range(n))
return total
原创
algorithm-003
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法