对于一个待分配糖果的小孩,先考虑它的前一个小孩,如果得分比它低,则分配比前一个人多一个的糖果;否则分配一个糖果,设给它分配了l个糖果。然后考虑后一个小孩,同样的分配规则,设给它分配了r个糖果,那么实际上给他分配的糖果应该是取max(l,r)。基于这样的贪心思路,我们可以两次相反的遍历顺序得出答案。
class Solution {
public:
int candy(vector<int>& ratings) {
int n=ratings.size();
vector<int> pre(n,0);
for(int i=0;i<n;i++){
if(i>0&&ratings[i]>ratings[i-1]){
pre[i]=pre[i-1]+1;
}else{
pre[i]=1;
}
}
int nxt=0,ans=0;
for(int i=n-1;~i;i--){
if(i<n-1&&ratings[i]>ratings[i+1]){
nxt++;
}else{
nxt=1;
}
ans+=max(pre[i],nxt);
}
return ans;
}
};
时间复杂度:O(n)
空间复杂度:O(n)