135.Candy
题意
有N个孩子排成一行。为每个孩子分配一个等级值。
您向这些儿童提供的糖果应符合以下要求:
1.每个孩子必须至少有一个糖果。
2.得分较高的孩子比他们的邻居得到更多的糖果。
你至少需要多少糖果?
思路1:
1.从左往右扫描,确保得分高的获得糖果多;
2.再从右往左扫描,确保左边得分高的比右边得到糖果多;
3.满足以上两步则满足题意
代码
#include <stdio.h>
int candy(int* ratings, int ratingsSize)
{
int candys = 0;
int candy[ratingsSize];
for (int i = 0; i < ratingsSize; i++)
{
candy[i] = 1;
}
for (int i = 1; i <ratingsSize; i++)
{
if (ratings[i] > ratings[i - 1])
{
candy[i] = candy[i - 1] + 1;
}
}
for (int i = ratingsSize - 2; i >=0; i--)
{
if (ratings[i] > ratings[i + 1] && candy[i] <= candy[i + 1])
{
candy[i] = candy[i + 1] + 1;
}
}
for (int i = 0; i < ratingsSize; i++)
{
candys += candy[i];
}
return candys;
}
//test
int main()
{
int a[7] = { 1,3,2,2,1};
printf("%d", candy(a, 5));
return 0;
}
思路2
1.从左往右扫描
2.遇到递增序列则一直加上糖果数
3.遇到递减数列则开始记录递减的长度
4.比较递减与递减前递增的长度大小来确定节点的糖果数
5.可以用等差数列计算公式来计算糖果数,不需要数组
代码
#include <stdio.h>
//等差计算
int plus(int n)
{
return (1 + n) * n / 2;
}
int candy(int* ratings, int ratingsSize)
{
int candys = 0;
int up = 1;
int down = 0;
for (int i = 1; i < ratingsSize; i++)
{
//递增
if (ratings[i] >= ratings[i - 1])
{
//前面递减
if (down > 0)
{
//递增长度大于递减
if (up > down)
{
//递减段糖果数
candys += plus(down);
//节点糖果数
candys += up;
}
//递减长度大于递增
else if(up<=down)
candys += plus(down + 1);candys+=plus(down);节点candys+=down+1;
//> up=2; = up=1;
up = ratings[i] > ratings[i - 1] ? 2 : 1;
down = 0;
}
//前面在递增
else if(down==0)
{
//该位置糖果数
candys += up;
//继续递增up+1;否则up变为1
up = ratings[i] > ratings[i - 1] ? (up + 1) : 1;
}
}
//递减
else
{
down++;
}
}
//最后一段为递减
if (down > 0)
{
//前一段递增长度大于递减的
if (up > down)
{
//递减部分的糖果总数
candys += plus(down);
//转折点的糖果数
candys += up;
}
//递减长度大于前一段递增
else
candys += plus(down + 1);//candys+=plus(down);candys+=down+1;
}
else
{
candys += up;
}
return candys;
}