题目
代码
解法一
int candy(vector<int>& ratings) {
vector<int> left(ratings.size());
left[0] = 1;
for (int i = 1; i < ratings.size(); i++) {
if (ratings[i - 1] < ratings[i]) left[i] = left[i - 1] + 1;
else left[i] = 1;
}
int right = 1;
int sum = left[ratings.size() - 1];
for (int i = ratings.size() - 2; i >= 0; i--) {
if (ratings[i + 1] < ratings[i]) right++;
else right = 1;
sum += max(left[i], right);
}
return sum;
}
解法二
第二种写法没有亲自写,这是leetcode的官方答案
class Solution {
public:
int candy(vector<int>& ratings) {
int n = ratings.size();
int ret = 1;
int inc = 1, dec = 0, pre = 1;
for (int i = 1; i < n; i++) {
if (ratings[i] >= ratings[i - 1]) {
dec = 0;
pre = ratings[i] == ratings[i - 1] ? 1 : pre + 1;
ret += pre;
inc = pre;
} else {
dec++;
if (dec == inc) {
dec++;
}
ret += dec;
pre = 1;
}
}
return ret;
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/candy/solution/fen-fa-tang-guo-by-leetcode-solution-f01p/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
总结
反思自己为什么没做出来这题,主要忽视的点还是没有意识到增序列减序列处理方法是不一样的,因为糖果无法减少为小于1的值。
方法一实质上是每一次遍历只处理增序列,反向遍历把减序列转换成增序列处理,很妙。
方法二是只有正向遍历, 但是同时处理两种序列,对于减序列,每遍历到一个新值就更新一遍之前减序列的值。算法的关键还在于,通过记录增序列和减序列的长度,处理增减序列的重合部分。