题目:
N个孩子站成一排,给每个人设定一个权重(已知)。按照如下的规则分配糖果:
(1)每个孩子至少分得一颗糖果
(2)权重较高的孩子,会比他的邻居获得更多的糖果。
问:总共最少需要多少颗糖果?请分析算法思路,以及算法的时间,空间复杂度是多少。
思路:
先把每个孩子的糖初始化为1,经过两轮扫描:
第一轮:保证后面比前面权值高的孩子,必定多得1个糖果
第二轮:保证前面比后面权值高的孩子,必定多得1个糖果
把分配矩阵求和即可
C++代码实现:
int candy(int *ratings, int size){
int *distributions = new int[size];
//let all the elements of distributions to be 1
for (int i = 0; i < size; i++)
distributions[i] = 1;
for (int i = 1; i < size; i++){
if (ratings[i - 1]<ratings[i])
distributions[i] = distributions[i - 1] + 1;
}
for (int i = 1; i < size; i++){
if (ratings[size - i]<ratings[size - i - 1] && distributions[size - i] > distributions[size - i - 1])
distributions[size - i - 1] = distributions[size - i] + 1;
}
//for sum
int sum = 0;
for (int j = 0; j < size; j++)
sum += distributions[j];
//free the memory
delete[] distributions;
return sum;
}