美文网首页
经典算法题:分发糖果

经典算法题:分发糖果

作者: 深圳都这么冷 | 来源:发表于2022-05-08 14:56 被阅读0次

    135. 分发糖果

    • 难度:困难

    n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。

    你需要按照以下要求,给这些孩子分发糖果:

    每个孩子至少分配到 1 个糖果。
    相邻两个孩子评分更高的孩子会获得更多的糖果。
    请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。

    示例 1:

    输入:ratings = [1,0,2]
    输出:5
    解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。
    示例 2:

    输入:ratings = [1,2,2]
    输出:4
    解释:你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。
    第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。

    提示:

    n == ratings.length
    1 <= n <= 2 * 104
    0 <= ratings[i] <= 2 * 104

    解题思路:

    • 万事不决先排序,然后按照分数由低向高分发
      第一步:按照分数排序,并且记住原始下标
      第二步:依次分发糖果,分发的时候,看两侧是不是分数比她低,如果是,保证糖果比它多即可

    • 其实这题根本算不得困难

    代码

    class Solution:
        def candy(self, ratings: List[int]) -> int:
            # 按照分数由低向高发
            # 分发的时候看两侧是不是分数比他低,然后保证糖果至少是邻居的数量+1
            dist_order = sorted([(score, idx) for idx, score in enumerate(ratings)])
            candies = [0 for _ in ratings]
            for score, idx in dist_order:
                need = 0
                if idx-1 >= 0 and ratings[idx-1] < score:
                    need = max(need, candies[idx-1])
                if idx+1 < len(ratings) and ratings[idx+1] < score:
                    need = max(need, candies[idx+1])
                candies[idx] = need+1
            return sum(candies)
    

    相关文章

      网友评论

          本文标题:经典算法题:分发糖果

          本文链接:https://www.haomeiwen.com/subject/fwdqurtx.html