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?
数组从左遍历一遍,当i比i-1的权值高时就分配给i比i-1多一个糖果,当i比i-1小时就分配给i一个糖果,分配结果保存在数组a[n]中。
再从右向左遍历一遍,同样方法,结果保存在b[n]中。
最后每个人分配的糖果数为a[i],b[i]的最大值。
Source
public class Solution {
public int candy(int[] ratings) {
if(ratings.length == 0) return 0;
int[] a = new int[ratings.length];
int[] b = new int[ratings.length];
a[0] = 1;
b[ratings.length - 1] = 1;
for(int i = 1; i < ratings.length; i++){
if(ratings[i] > ratings[i - 1])
a[i] = a[i - 1] + 1;
else a[i] = 1;
}
for(int i = ratings.length - 2; i >= 0; i--){
if(ratings[i] > ratings[i + 1])
b[i] = b[i + 1] + 1;
else b[i] = 1;
}
int cnt = 0;
for(int i = 0; i < ratings.length; i++)
cnt += Math.max(a[i], b[i]);
return cnt;
}
}
Test
public static void main(String[] args){
int[] ratings = {0,2,0,1,2,3,1,0};
System.out.println(new Solution().candy(ratings));
}