解题思路: 贪心(每次遍历只考虑一侧的大小关系)
(1)将所有孩子的糖果初始化为1
(2)从左往右遍历,若右边孩子的评分比左边的高,则右边孩子的糖果数更新为左边孩子的糖果数加1
(3)从右往左遍历,若左边孩子的评分比右边的高且左边孩子当前的糖果数不大于右边孩子的糖果数,则左边孩子的糖果数更新为右边孩子的糖果数加1
int candy(vector<int>& ratings) {
int size = ratings.size();
if (size < 2) {
return size;
}
vector<int> num(size, 1);
for (int i = 1; i < size; ++i) {
if (ratings[i] > ratings[i-1]) {
num[i] = num[i-1] + 1;
}
}
for (int i = size - 1; i > 0; --i) {
if (ratings[i] < ratings[i-1]) {
num[i-1] = max(num[i-1], num[i] + 1);
}
}
return accumulate(num.begin(), num.end(), 0); // std::accumulate 可以很方便地求和
}