对于一个待分配糖果的小孩,先考虑它的前一个小孩,如果得分比它低,则分配比前一个人多一个的糖果;否则分配一个糖果,设给它分配了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)
糖果分配问题的贪心算法
本文介绍了一种解决糖果分配问题的贪心算法。该算法通过两次相反遍历,确保每个孩子获得的糖果数量既公平又符合得分高低。文章详细展示了算法实现,并分析了其时间复杂度为O(n),空间复杂度也为O(n)。
590

被折叠的 条评论
为什么被折叠?



