class Solution:
def candy(self, ratings: List[int]) -> int:
nums = [1]*len(ratings)
#从左至右遍历
for i in range(len(ratings)):
if i>0 and ratings[i]>ratings[i-1]:
nums[i]=nums[i-1]+1
right = 0
count = 0
n = len(ratings)
#从右边至左,然后比较从左至右相同位置的最大值,该值就是最后的至少需要的糖果数量
#右边的初始化和最左边的初始化一样,都是1
for i in range(n-1,-1,-1):
if i<n-1 and ratings[i]>ratings[i+1]:
right+=1
else:
right=1
count+=max(nums[i],right)
return count
- 孩子从左往右和从右往左分两种情况
- 如果A和B相邻,A在B的左边,那么ratingA>ratingB,A的糖果数量必须大于B(rule 1)
- 如果A和B相邻,A在B的左边,那么ratingB>ratingA,B的糖果数量必须大于A(rule 2)
- 所以所有学生必须满足这两种规则
- 接下来就是遍历
- 初始化一个都为1的数组
- 然后从左到右遍历,记录index位置的糖果数量
- 接下来从右到左遍历,记录index位置的糖果数量
- 然后比较同一个index的左右两种扫描那种大,这样才能保证同时满足两个规则
- 然后将遍历的结果加起来
这个图来自解题区的一位大佬
总结:这个题目看似是只有一种规则,其实 从左到右和从右到左两种规则。