您的位置:首页 > 理论基础 > 数据结构算法

135. Candy

2017-06-05 01:21 295 查看
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?

Subscribe to see which companies asked this question.
解析已经在注释里面:
关键点是第一次遍历令只要右边孩子比相邻左边孩子级别高则糖果数多一个后;
那么第二次遍历不仅要考虑只要左边孩子比右边孩子的级别高则糖果数多一个,还必须是
在左边孩子的糖果数不多于右边孩子的情况下,否则你这样处理 就会导致错误;
代码如下:
class Solution {

public:

    int candy(vector<int>& ratings) {

        vector<int> candys;

        //先给每个小朋友分一块糖果;

        candys.resize(ratings.size(),1);//模板类的用法,rezize(a,b),

                                       //a是这个数组的长度,b是这个数组赋予的初值;

        //第一步,从左到右遍历,保证我任意抽取出一对相邻的小朋友,都能有只要右边

        //朋友的级别比左边小朋友的级别高,那么他的糖果数就是左边小朋友的糖果数加一;

        //只多一个,来保证所用糖果数最少;

        for(int i=1;i<ratings.size();i++){

            if(ratings[i]>ratings[i-1]){

                candys[i]=candys[i-1]+1;

            }

        }

        /*第二步,从右到左遍历,保证我任意抽取出一对相邻的小朋友,只要左边小朋友的

        级别比右边的高,他的糖果数都能比右边小朋友的糖果数多一个,这样也是保证使用的糖果数目最少*/

        for(int i=ratings.size()-1;i>=0;i--){

            if(ratings[i-1]>ratings[i]&&candys[i-1]<=candys[i]){

                candys[i-1]=candys[i]+1;

            }

       }

        /*这样就能保证了我任意抽出一对小朋友,他们级别高的那个一定比级别低那个的糖果数目多一个,同时保证了使用的糖果数目最少,综合一开始每人至少一块*/

        /*这里的问题在于如果两个人的级别相等,他们的糖果数目可以不一致,注意*/

        int sum=0;

        for(int i=0;i<ratings.size();i++){

            sum=sum+candys[i];

        }

    return sum;

    }

    

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息