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