解法一:两遍遍历,从左向右与从右往左
class Solution {
public:
int candy(vector<int>& ratings) {
int N = ratings.size();
vector<int>candies(N,1);
int mycandies = 0 ;
//左规则
for(int i=1;i<N;i++){
if(ratings[i]>ratings[i-1]){
candies[i]=candies[i-1]+1;
}
}
//右规则
for(int i=N-2;i>=0;i--){
if(ratings[i]>ratings[i+1]&&candies[i]<=candies[i+1]){
candies[i]=candies[i+1]+1;
}
}
for(int i=0;i<N;i++)
mycandies += candies[i];
return mycandies;
}
};
解法二:暴力
class Solution {
public:
int candy(vector<int>& ratings) {
int N = ratings.size();
int mycandies = 1 ; //返回值
int len1 = 1,len2 = 0;//当前递增和递减长度
int candies = 1;//上一个儿童的糖果数目。
for(int i=1;i<N;i++){
if(ratings[i]>=ratings[i-1]){ //当前不比上一个儿童矮
candies = (ratings[i]==ratings[i-1]?1:candies+1); //如果相等为1,否则加1
mycandies+=candies;//加上当前位置的糖果
len2 = 0;//递减为0
len1 = candies;//递增长度为此时的糖果数
}
else{
len2++;//递减+1 相等于递减时 最大元素的糖果数+1 当前为1
if(len2 == len1) len2++; //递增和递减长度决定了递增或者递减时最大的数目,相等说明要把递增的最后一个糖果数+1
mycandies+= len2; //加上此时的糖果数
candies = 1;//当前糖果数为1
}
}
return mycandies;
}
};