《Leetcode of December》135.分发糖果

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的左右两种扫描那种大,这样才能保证同时满足两个规则
    • 然后将遍历的结果加起来

 这个图来自解题区的一位大佬

总结:这个题目看似是只有一种规则,其实 从左到右和从右到左两种规则。

猜你喜欢

转载自blog.csdn.net/weixin_37724529/article/details/111632801