分配糖果

xiaoxiao2021-02-28  38

题目:

 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。  你需要按照以下要求,帮助老师给这些孩子分发糖果:          每个孩子至少分配到 1 个糖果。          相邻的孩子中,评分高的孩子必须获得更多的糖果。  那么这样下来,老师至少需要准备多少颗糖果呢?    示例1:  输入: [1,0,2]  输出: 5  解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。  

 示例2:  输入: [1,2,2]  输出: 4  解释: 你可以分别给这三个孩子分发 1、2、1 颗糖果。  第三个孩子只得到 1 颗糖果,这已满足上述两个条件。

 

解题思路:

本题是一道动态规划题。主要方法是分别从左往右和从右往左遍历。

如果后一个比前一个大,那就+1;如果不是,则取1(因为最少要分配1个)。

需要注意的是遇“山峰”时,需要判断大小,比如:[1,2,3,4,2,1],从左往右到山峰“4”的值是4,而从右往左到山峰“4”的值是3,这时应该取4。如果不加判断,逆向遍历的时候就会用3覆盖掉之前的4!

 

具体代码(Java):

     /**分配糖果**/ public int candy(int[] ratings) { int candy_num = 0; //糖果总数 Integer[] num = new Integer[ratings.length]; num[0] = 1; //从左往右遍历 for(int i=1;i<ratings.length;i++) { if(ratings[i] > ratings[i-1]) { num[i] = num[i-1]+1; }else { num[i] = 1; } } //从右往左遍历 for(int i=ratings.length-1;i>0;i--) { if(ratings[i-1] > ratings[i] && num[i]+1>num[i-1]) { num[i-1] = num[i]+1; } } for(Integer i:num) { candy_num += i; } return candy_num; }

 

 

 

转载请注明原文地址: https://www.6miu.com/read-2614110.html

最新回复(0)