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?
Scan from left to right and store the minimum possible number of candies for each child in an array. Then scan from right to left, and store the minimum number of candies for each child in an array. The larger results in the two calculation is the minimum number of candies that should be given to each child. Add then all and get the result.
public class Solution {
public int candy(int[] ratings) {
if (ratings == null || ratings.length == 0) {
return 0;
}
int[] min = new int[ratings.length];
min[0] = 1;
for (int i = 1; i < ratings.length; i++) {
if (ratings[i] > ratings[i - 1]) {
min[i] = min[i - 1] + 1;
} else {
min[i] = 1;
}
}
int res = min[ratings.length - 1];
for (int i = ratings.length - 2; i >= 0; i--) {
int cur = 1;
if (ratings[i] > ratings[i + 1]) {
cur = min[i + 1] + 1;
}
res += Math.max(min[i], cur);
min[i] = cur;
}
return res;
}
}