LeetCode135.分发糖果(贪心算法)

思路:

贪心:通过局部最优,达到全局最优

本题:先从左侧开始,如果右边孩子比左边孩子评分高ratings[i]>rating[i-1],则多发一颗糖tg[i]=tg[i-1]+1;

for(i=1;i<n;i++)

{

    if(ratings[i]>ratings[i-1])

    {

        tg[i]=tg[i-1]+1;

    }

    else{tg[i]=1;}

左遍历后:

ratings3585312
tg1231112

从图中可以看出,如果孩子评分向右递减,单纯的左遍历就出现了问题(我做这题一开始就卡在这了呜呜呜),那我们可以试一下从右往左遍历,如果左边孩子比边右孩子评分高ratings[i-1]>rating[i],并且左边孩子糖果没有比右边孩子多tg[i-1]<=tg[i],则多发一颗糖tg[i-1]=tg[i]+1;

for(i=n-1;i>0;i--)

{

    if(ratings[i-1]>ratings[i]&&tg[i-1]<=tg[i])

        tg[i-1]=tg[i]+1;

}

ratings3585312
tg1243212

最后用一次遍历,把所有孩子的糖果加一起,就得出最少糖果数目

for(i=0;i<n;i++)

    s+=tg[i];

AC代码 :

int candy(int* ratings, int ratingsSize){
int i,n=ratingsSize;
int tg[n];
tg[0]=1;
for(i=1;i<n;i++)
{
    if(ratings[i]>ratings[i-1])
    {
        tg[i]=tg[i-1]+1;
    }
    else{tg[i]=1;}
}
for(i=n-1;i>0;i--)
{
    if(ratings[i-1]>ratings[i]&&tg[i-1]<=tg[i])
    {
        tg[i-1]=tg[i]+1;
    }
}
int s=0;
for(i=0;i<n;i++)
{
    s+=tg[i];
}
return s;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值