算法:分配糖果

题目:

 老师想给孩子们分发糖果,有 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;
	}


猜你喜欢

转载自blog.csdn.net/qq_38310176/article/details/80951380