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.
public class Solution {
public int candy(int[] ratings) {
int len = ratings.length;
if(len == 0 || len == 1) return len;
// start with every child already has one candy
int min = len;
int[] candies = new int[len];
// scan from head + 1 to tail, compare each child with their next neighbos's rating
int cur = 0;
for(int i = 1; i < len; i++) {
if(ratings[i - 1] < ratings[i])
cur++;
else
cur = 0;
candies[i] = cur;
}
// scan from tail - 1 to head, do the same process as above loop
cur = 0;
for(int i = len - 2; i >= 0; i--) {
if(ratings[i] > ratings[i + 1])
cur++;
else
cur = 0;
// no need to store another candies array again, just compare each node and store the max
// (why max: candy num of this position should match with both left and right neighbors)
min += Math.max(candies[i], cur);
}
// add the candy num of the tail position, since the loop for add a sum didn't cover that position
min += candies[len - 1];
return min;
}
}
Many thanks to : http://blog.csdn.net/violet_program/article/details/12233949
No comments:
Post a Comment