有 N 个小孩站成一列。每个小孩有一个评级。
按照以下要求,给小孩分糖果:
-
每个小孩至少得到一颗糖果。
-
相邻小孩之间,评级越高的小孩可以得到更多的糖果。
需最少准备多少糖果?
class Solution {
public:
/**
* @param ratings Children's ratings
* @return the minimum candies you must give
*/
int candy(vector<int>& ratings) {
int len = ratings.size();
int num[10000] = {0};
num[0] = 1;
int he = 0;
for (int i = 1; i < len; i++) {
if (ratings[i] > ratings[i - 1]) {
num[i] = num[i - 1] + 1;
} else if (ratings[i] < ratings[i - 1]) {
num[i] = min(num[i - 1] - 1, 1);
} else if (ratings[i] == ratings[i - 1]) {
num[i] = 1;
}
if (num[i] == 0) {
int m = 0;
for (int j = 1; j <= i; j++) {
if (i - j == 0) {
m = 0;
break;
} else if (ratings[i - j] > ratings[i - j + 1] && num[i - j] - num[i - j - 1] <= -2) {
m = i - j;
break;
} else if (ratings[i - j] > ratings[i - j + 1] && ratings[i - j] >= ratings[i - j - 1]) {
m = i - j;
break;
}
}
for ( ; m <= i; m++) {
num[m] = num[m] + 1;
}
}
}
for (int n = 0; n < len; n++) {
if (num[n] == 0) {
break;
} else {
he = he + num[n];
}
}
return he;
}
};
样例
给定评级 = [1, 2]
, 返回 3
.
给定评级 = [1, 1, 1]
, 返回 3
.
给定评级 = [1, 2, 2]
, 返回 4
. ([1,2,1]).