题目:candy
难度:HARD
问题描述:
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.
结题思路:
* 从左往右顺一遍,r[i]>r[i-1],则 per[i]=per[i-1]+1,否则 per[i]=1;
* 再从右往左顺一遍,r[i-1]>r[i],则per[i-1] = max(per[i]+1,per[i-1])
代码如下:
public int candy(int[] ratings) { int size = ratings.length; if(size<2) return size; int[] per = new int[size]; //每人至少0根,最后加上size即可 for(int i=1;i<size;i++){ if(ratings[i]>ratings[i-1]){ per[i] = per[i-1]+1; } } for(int i=size-1;i>0;i--){ if(ratings[i-1]>ratings[i]){ per[i-1] = Math.max(per[i-1], per[i]+1); } } int res = size; for(int w : per){ res += w; } return res; }