package heap; import java.util.*; /** * Created by gouthamvidyapradhan on 26/07/2018. 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? * *

Example 1: * *

Input: [1,0,2] Output: 5 Explanation: You can allocate to the first, second and third child * with 2, 1, 2 candies respectively. Example 2: * *

Input: [1,2,2] Output: 4 Explanation: You can allocate to the first, second and third child * with 1, 2, 1 candies respectively. The third child gets 1 candy because it satisfies the above * two conditions. * *

Solution: O(N log N): Store the indexes in a heap, iterate through the heap one by one and * assign candies one greater than its neighbours. Take care of edge cases. */ public class Candy { /** * Main method * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { int[] ratings = {29, 51, 87, 87, 72, 12}; System.out.println(new Candy().candy(ratings)); } public int candy(int[] ratings) { if (ratings.length == 1) return 1; PriorityQueue pq = new PriorityQueue<>((o1, o2) -> Integer.compare(ratings[o1], ratings[o2])); for (int i = 0; i < ratings.length; i++) { pq.offer(i); } int[] count = new int[ratings.length]; while (!pq.isEmpty()) { int index = pq.poll(); if (index - 1 < 0) { if (ratings[index + 1] == ratings[index]) { count[index] = 1; } else { count[index] = count[index + 1] + 1; } } else if (index + 1 >= ratings.length) { if (ratings[index - 1] == ratings[index]) { count[index] = 1; } else { count[index] = count[index - 1] + 1; } } else { if ((ratings[index - 1] == ratings[index]) && (ratings[index + 1] == ratings[index])) { count[index] = 1; } else { if (((ratings[index - 1] == ratings[index]) && (ratings[index + 1] > ratings[index])) || ((ratings[index + 1] == ratings[index]) && (ratings[index - 1] > ratings[index]))) { count[index] = 1; } else if (((ratings[index - 1] == ratings[index]) && (ratings[index + 1] < ratings[index]))) { count[index] = count[index + 1] + 1; } else if (((ratings[index + 1] == ratings[index]) && (ratings[index - 1] < ratings[index]))) { count[index] = count[index - 1] + 1; } else { if (count[index - 1] > count[index + 1]) { count[index] = count[index - 1] + 1; } else { count[index] = count[index + 1] + 1; } } } } } int result = 0; for (int c : count) { result += c; } return result; } }