首页 > 代码库 > Candy

Candy

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