当前位置:   article > 正文

LeetCode135. 分发糖果(贪心算法)_leetcode糖果问题

leetcode糖果问题

1 题目描述

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:

  • 每个孩子至少分配到 1 个糖果。
  • 相邻两个孩子评分更高的孩子会获得更多的糖果。

请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。

2 算法设计

这道题目最好从一边开始考虑,如果两边同时考虑的话容易出错。
(1)先按照从左到右的顺序遍历数组ratings,确定右边评分大于左边的情况。
局部最优: 只要右边评分比左边评分高,右边就比左边多一个糖果。
全局最优: 相邻的孩子中,评分高的右孩子比左孩子获得更多的糖果。
(2)再按照从右到左的顺序遍历数组ratings,确定左边评分大于右边评分的情况。
局部最优: 只要左边评分比右边评分高,左边的孩子就比右边的孩子多一个糖果。
全局最优: 相邻的孩子中,评分高的左孩子比右孩子获得更多的糖果。

3 代码实现

 public static int candy(int[] ratings) {
        int[] candy = new int[ratings.length];
        Arrays.fill(candy,1); //所有的孩子至少有一个糖果
        //从左向右遍历,使得相邻孩子中,评分高的右孩子获得比左孩子更多的糖果
        for(int i=1;i< ratings.length;i++){
            candy[i] = ratings[i] > ratings[i-1] ? candy[i-1]+1:candy[i];
        }
        //从右向左遍历,确定左边大于右边的情况
        for (int j=ratings.length-2;j>=0;j--){
           if (ratings[j] > ratings[j+1]){
               if (candy[j] <= candy[j+1]){
                   candy[j] = candy[j+1]+1;
               }
           }
        }
        return  Arrays.stream(candy).sum();
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

4 测试结果

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/49548?site
推荐阅读
相关标签
  

闽ICP备14008679号