Candy
Total Accepted: 12328 Total Submissions: 68006There 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?
public class Solution {
public int candy(int[] ratings) {
int len = ratings.length;
if(len<1) return 0;
int[] d = new int[len];
d[0] = 1;
for(int i=1; i<len; i++) {
if(ratings[i] >ratings[i-1]) {
d[i] = d[i-1] + 1;
} else {
d[i] = 1;
}
}
int total = d[len-1];
d[len-1] = 1;
for(int i=len-2; i>=0; i--) {
int cur = 1;
if(ratings[i] > ratings[i+1]) {
cur = d[i+1] + 1;
}
total += Math.max(cur, d[i]);
d[i] = cur;
}
return total;
}
}
"这种两边扫描的方法是一种比较常用的技巧,LeetCode中 Trapping Rain Water和这道题都用到了,可以把这种方法作为自己思路的一部分,通常是要求的变量跟左右元素有关系的题目会用到哈。" [1]
如果从头开始找,然后每次都更新是很麻烦的。于是可以找到整个数列的波峰和波谷,每个波谷的都设为1,然后两边开始增加。但这样code社会会很复杂。[2]
Reference:
[1] http://blog.csdn.net/linhuanmars/article/details/21424783
[2] http://jane4532.blogspot.com/2013/10/candyleetcode.html