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;}

左遍历后:

ratings 3 5 8 5 3 1 2
tg 1 2 3 1 1 1 2

从图中可以看出,如果孩子评分向右递减,单纯的左遍历就出现了问题(我做这题一开始就卡在这了呜呜呜),那我们可以试一下从右往左遍历,如果左边孩子比边右孩子评分高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;

}

ratings 3 5 8 5 3 1 2
tg 1 2 4 3 2 1 2

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

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;
}

猜你喜欢

转载自blog.csdn.net/GANTENJ/article/details/123082000
今日推荐