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?
因为每个人给candy的方法都是一样的,所以就想到了递归。如果邻居比自己rating低,但没给过,就先递归这个邻居。
另外看到了一种从前往后扫一遍,再从后往前扫一边的。
但还是给自己一次AC+递归点个赞!
class Solution {
public:
int candy(vector<int> &ratings) {
int n = ratings.size();
vector<int> ans(n);
int tot = 0;
for (int i = 0; i < n; i++) {
if (ans[i] == 0)
give(ans, ratings, n, i);
tot += ans[i];
}
return tot;
}
void give(vector<int> &ans, vector<int> &ratings, int n, int i) {
if (i < n - 1 && ratings[i] > ratings[i + 1])
give(ans, ratings, n, i + 1);
if (i > 0 && ratings[i] > ratings[i - 1])
ans[i] = ans[i - 1] + 1;
if (i < n - 1 && ratings[i] > ratings[i + 1])
ans[i] = max(ans[i], ans[i + 1] + 1);
if (ans[i] == 0)
ans[i] = 1;
//cout << i << ans[i] << endl;
}
};
public class Solution {
public int candy(int[] ratings) {
int N = ratings.length;
if(N == 0){
return N;
}
int[] candy = new int[N];
int sum = N;
for(int i = 0, k = 1; i < N; i++){
if(i - 1 >= 0 && ratings[i] > ratings[i - 1]){
candy[i] = Math.max(k ++, candy[i]);
} else {
k = 1;
}
}
for(int i = N - 1, k = 1; i >= 0; i--){
if(i + 1 < N && ratings[i] > ratings[i + 1]){
candy[i] = Math.max(k ++, candy[i]);
} else {
k = 1;
}
}
for(int i = 0; i < N; i++){
sum += candy[i];
}
return sum;
}
}