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?

Solution:

  1. public class Solution {
  2. public int candy(int[] ratings) {
  3. if (ratings == null || ratings.length == 0) return 0;
  4. int n = ratings.length;
  5. // arr[i] stores the num of candies of i-th kid
  6. int[] arr = new int[n]; arr[0] = 1;
  7. // scan from left to right
  8. for (int i = 1; i < n; i++)
  9. arr[i] = (ratings[i] > ratings[i - 1]) ? arr[i - 1] + 1 : 1;
  10. // scan from right to left
  11. int sum = arr[n - 1];
  12. for (int i = n - 2; i >= 0; i--) {
  13. if (ratings[i] > ratings[i + 1])
  14. arr[i] = Math.max(arr[i], arr[i + 1] + 1);
  15. sum += arr[i];
  16. }
  17. return sum;
  18. }
  19. }