135. 分发糖果

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

你可能感兴趣的:(135. 分发糖果)