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?
Analysis:
For one child(in the middle of three children), there are four situations of relations with his neighbors.
- lower, higher, highest.
- lower, higher, lower
- higher,lower,higher
- highest,higher,lower
First, We iterate from the head to the tail, after doing this, we can calculate the candies for children who are in situation 1 and 3.
Then, We iterate from the tail to the head, after doing this, we deal with situation 2 and 4.
Besides, if neighbors's rating are the same, there is no need to ensure their candies are the same.
Solution:
public class Solution {
public int candy(int[] ratings) {
int length = ratings.length;
if(length == 0){
return 0;
}else if(length == 1){
return 1;
}else if(length == 2){
if(ratings[0] == ratings[1]){
return 2;
}else{
return 3;
}
}
int[] numbers = new int[length];
for(int i = 0; i < length; i++){
numbers[i] = -10000;
}
if(ratings[0] <= ratings[1]){
numbers[0] = 1;
}
for(int i = 1; i < length - 1; i++){
if(ratings[i] < ratings[i -1] && ratings[i] <= ratings[i + 1]){
numbers[i] = 1;
}else if(ratings[i] > ratings[i - 1] && ratings[i] <= ratings[i + 1]){
numbers[i] = numbers[i -1] + 1;
}else if(ratings[i] == ratings[i - 1] && ratings[i] <= ratings[i + 1]){
numbers[i] = 1;
}
}
if(ratings[length - 1] <= ratings[length - 2]){
numbers[length - 1] = 1;
}else{
numbers[length - 1] = numbers[length -2] + 1;
}
for(int i = length - 2; i > 0; i--){
if(ratings[i] > ratings[i + 1] && ratings[i] > ratings[i - 1]){
if(numbers[i - 1] > numbers[i + 1]){
numbers[i] = numbers[i - 1] + 1;
}else{
numbers[i] = numbers[i + 1] + 1;
}
}else if(ratings[i] > ratings[i + 1] && ratings[i] <= ratings[i - 1]){
numbers[i] = numbers[i + 1] + 1;
}else if(ratings[i] == ratings[i + 1] && ratings[i] <= ratings[i - 1]){
numbers[i] = 1;
}
}
if(ratings[0] > ratings[1]){
numbers[0] = numbers[1] + 1;
}
int total = 0;
for(int i = 0; i < length; i++){
total += numbers[i];
}
return total;
}
}
文章来源:https://oj.leetcode.com/problems/candy/