Problem:Candy
There are N children standing in a line. Each child is assigned a rating value.
You are giving candies to these children subjected to the following requirements:
- Each child must have at least one candy.
- Children with a higher rating get more candies than their neighbors.
What is the minimum candies you must give?
思路:遍历两次,首先从左往右,只看左边的邻居,满足条件:如果ratings[i] > ratings[i-1],则candy_num_1[i] > candy_num_1[i-1]。然后从右往左,只看右边的邻居,满足条件:如果ratings[i] > ratings[i+1],则candy_num_2[i] > candy_num_2[i+1]。然后取两个数组中每个孩子分得的糖果数的较大值,则每个孩子所拥有的糖果数,既对其左邻居满足条件,又对其右邻居满足条件,且能保证分得的糖果总数最少。class Solution {
public:
int candy(vector<int> &ratings) {
int n = ratings.size();
if(n == 0 || n == 1)
return n;
int sum = 0;//保存最少糖果的总数
int candy_num[n];
int cur_candy = 1;
int i = 0;
while(i < n)//初始化数组,每人至少分配一颗
{
candy_num[i] = 1;
i++;
}
for(i = 1; i < n; i++)//从左往右遍历
{
if(ratings[i] > ratings[i-1])
candy_num[i] = candy_num[i-1] + 1;
}
sum = candy_num[n-1];
for(i = n-2; i > -1; i--)//从右往左遍历
{
if(ratings[i] > ratings[i+1])
{
cur_candy++;
sum += max(cur_candy, candy_num[i]);
}
else
{
cur_candy = 1;
sum += candy_num[i];
}
}
return sum;
}
int max(int a, int b)
{
return a>b?a:b;
}
};