思路:
贪心:通过局部最优,达到全局最优
本题:先从左侧开始,如果右边孩子比左边孩子评分高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;
}