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?
有一排小孩,给他们分糖果,每人至少分一个,高个比相邻的低个分的糖果多。
两次扫描,先从左往右,从k=1开始分配,遇到高个k++,遇到矮个子 k = 1;
然后从右往左扫描,k = max(1,pre) pre是之前扫描是的糖果,遇到搞个k++,遇到矮个子 k = max(1,pre);
class Solution {
public:
int candy(vector<int> &ratings) {
// Note: The Solution object is instantiated only once and is reused by each test case.
if(ratings.size() <= 1) return ratings.size();
int *num = new int[ratings.size()];
for(int i = 0 ; i < ratings.size(); i++) num[i] = 0;
int sum = ratings.size();
for(int i = 0, k = 1; i < ratings.size(); i++) {
if(i-1 >= 0 && ratings[i] > ratings[i-1]) {
num[i] = (k > num[i] ? k : num[i]);
k++;
}else {
k = 1;
}
}
for(int i = ratings.size()-1, k = 1; i >= 0; i--) {
if(i+1 < ratings.size() && ratings[i] > ratings[i+1]) {
num[i] = (k > num[i] ? k : num[i]);
k++;
}else {
k = 1;
}
}
int total = ratings.size();
for(int i = 0 ; i < ratings.size(); i++) total += num[i];
delete []num;
return total;
}
};