根据等级分糖果
N 个孩子站成一排,给每个人设定一个权重(已知)。按照如下的规则分配糖果:
(1) 每个孩子至少分得一颗糖果
(2) 权重较高的孩子,会比他的邻居获得更多的糖果。 总共最少需要多少颗糖果?
a. 编程实现
b. 分析给出算法的时间空间复杂度
Example 1:
Input: [1,0,2]
Output: 5
Example 2:
Input: [1,2,2]
Output: 4
a.
思路:设每个孩子分配到糖果的数组为candies,全部初始化为1,代表了没人至少分配到一颗糖。
先从左向右扫描数组,和前面的邻居比较,如果ratings[i] > ratings[i-1],则candies[i] = candies[i-1] + 1。
再从右向左扫描数组,和后面的邻居比较,如果ratings[i] > ratings[i+1],则candies[i]取candies[i]和candies[i+1]中的较大者。
最后对candies求和即可。
java代码如下(主函数和测试函数在Candy.java文件中):
public int find(int[] ratings) {
int[] candies = new int[ratings.length];
Arrays.fill(candies, 1);
for(int i = 1; i < candies.length ; i++) {
if(ratings[i] > ratings [i-1]) {
candies[i] = candies[i-1] + 1;
}
}
for(int i = candies.length - 2 ; i>=0 ;i--) {
if(ratings[i] > ratings[i+1]) {
candies[i] = Math.max(candies[i], candies[i+1] + 1);
}
}
int sum = 0 ;
for(int s : candies) {
sum += s;
}
return sum;
}
b.分析算法时间空间复杂度
分别从左向右和从右向左扫描candies数组,最后求和的时候再次扫描一遍candies数组,时间复杂度O(n);
使用一个candies数组存储数据,空间复杂度O(n)。