一:论语
二:题目
三:上码
class Solution {
public:
int candy(vector<int>& ratings) {
/**
思路:1.这里我们分两次遍历(从左向右 从右向左)
2.当我们从左向右遍历的时候 如果右边的评分比左边孩子分数高 那么右边孩子的糖果数上
就在左边孩子糖果数上加一
3.当我们从右向左遍历的时候,如果左边的评分比右边的评分高的话 并且其糖果个数小于右边的话
那么左边孩子的糖果数 = 右边的孩子的糖果数+1
*/
map<int,int>m;
map<int,int>:: iterator mt;
int sum = 0;
for(int i = 0; i < ratings.size(); i++) {
m[i] = 1;
}
//从左向右
for(int i = 0; i < ratings.size()-1; i++) {
if(ratings[i+1] > ratings[i]){//右边孩子的糖果个数大于左边的糖果个数
m[i+1] = m[i]+1;
}
}
//从右向左
for(int i = ratings.size()-1; i > 0; i--) {
if(ratings[i-1] > ratings[i] && m[i-1] <= m[i]) {// m[i-1] <= m[i] 保证要增加糖果的一侧的
m[i-1] = m[i] + 1; //糖果数是小于等于右边的
}
}
for(mt = m.begin(); mt != m.end(); mt++) {
sum += mt->second;
}
// int sum = accumulate(mt->second().begin(),mt->second().end(),0);
return sum;
}
};