* There are N children standing in a line. Each child is assigned a rating value.
* You are giving candies to these children subjected to the following requirements:
* Each child must have at least one candy.
* Children with a higher rating get more candies than their neighbors.
* What is the minimum candies you must give?
package com.leetcode.dyncplanning;
import java.util.Arrays;
/**
* 题目:
* candy
*
* 题目描述:
* There are N children standing in a line. Each child is assigned a rating value.
* You are giving candies to these children subjected to the following requirements:
* Each child must have at least one candy.
* Children with a higher rating get more candies than their neighbors.
* What is the minimum candies you must give?
*
*/
public class Candy {
/**
* 思路:
* 1、先全部分一个糖果
* 2、从左到右判断是否满足规则,不满足的增加糖果
* 3、从右往左判断是否满足规则,不满足的增加糖果
*
* @param ratings 概率数组
* @return 糖果最小数量
*/
public int candy(int[] ratings) {
if (ratings == null || ratings.length <= 0) {
return 0;
}
int len = ratings.length;
// 构建每个孩子拥有糖果数量的数组,初始化为1
int[] candys = new int[len];
Arrays.fill(candys, 1);
// 从左到右处理数组
for (int i=1; i<len; i++) {
if (ratings[i] > ratings[i-1]) {
candys[i] = candys[i-1] + 1;
}
}
// 从右到左处理数组,并对数组中的元素求和,但是要记得最后加上第一个元素
int sum = 0;
for (int i=len-1; i>0; i--) {
if (ratings[i-1] > ratings[i]) {
// 如果左侧元素不大于右侧元素,则更新左侧元素为右侧元素+1
if (candys[i-1] <= candys[i]) {
candys[i-1] = candys[i] + 1;
}
}
sum += candys[i];
}
return sum + candys[0];
}
public static void main(String[] args) {
int[] arr = {4,2,3,4,1};
System.out.println(new Candy().candy(arr));
}
}
leetcode题目 candy题目描述 * There are N children standing in a line. Each child is assigned a rating value. * You are giving candies to these children subjected to the following requirements: * Each ...