题目出处:https://leetcode-cn.com/problems/candy/
思路:两次遍历
- 评分高的孩子比他两侧的相邻孩子获得更多的糖果,等价于同时满足以下两个条件: 条件1:若rating[i]>rating[i+1],则i位的糖果比i+1位的糖果多; 条件2:若rating[i]>rating[i-1],则i位的糖果比i-1位的糖果多。
- 第一次只考虑满足条件1的时候,每位小朋友分到的苹果ans1;第二次考虑满足条件2的时候,每位小朋友分到的苹果ans2。
- 最终每个小朋友分到的苹果数量是,ans1和ans2的最大值。
代码:
class Solution {
public:
int candy(vector<int>& ratings) {
int n = ratings.size();
vector<int> l_dp(n, 1);
for(int i = 0; i < n; ++i){ // 左规则
if(i > 0 && ratings[i] > ratings[i-1]){
l_dp[i] = l_dp[i-1]+1;
}
else{
l_dp[i] = 1;
}
}
vector<int> r_dp(n, 1);
int ans = 0;
for(int i = n-1; i >= 0; --i){ //右规则
if(i < n-1 && ratings[i] > ratings[i+1]){
r_dp[i] = r_dp[i+1]+1;
}
else{
r_dp[i] = 1;
}
ans += max(r_dp[i], l_dp[i]); //取两者的最大值
}
return ans;
}
};