数组-分糖果-困难

描述
有 N 个小孩站成一列。每个小孩有一个评级。
按照以下要求,给小孩分糖果:
每个小孩至少得到一颗糖果。
评级越高的小孩可以比他相邻的两个小孩得到更多的糖果。
需最少准备多少糖果?
您在真实的面试中是否遇到过这个题?  
样例
给定评级 = [1, 2], 返回 3.
给定评级 = [1, 1, 1], 返回 3.

给定评级 = [1, 2, 2], 返回 4. ([1,2,1]).

题目链接

程序


class Solution {
public:
    /**
     * @param ratings: Children's ratings
     * @return: the minimum candies you must give
     */
    int candy(vector<int> &ratings) {
        // write your code here
        if(ratings.empty())
            return 0;
        if(ratings.size() == 1)
            return 1;
        vector<int> results(ratings.size(), 0);
        for(int i = 1; i < ratings.size(); i++){
            if(ratings[i] > ratings[i - 1] && results[i - 1] == 0)
                results[i] = 1;
            //在原来已经是1的位置上再加1
            else if(ratings[i] > ratings[i - 1] && results[i - 1] != 0)
                results[i] = results[i - 1] + 1;
        }
        //上面是从左向右遍历过来,为了保存原来的数值,需要加max
        //比如[4,2,3,4,1],经过上面的计算后[0,0,1,2,0]
        for(int i = ratings.size() - 2; i >= 0; i--){
            if(ratings[i] > ratings[i + 1] && results[i + 1] == 0)
                results[i] = max(1, results[i]);
            else if(ratings[i] > ratings[i + 1] && results[i + 1] != 0)
                results[i] = max(results[i], results[i + 1] + 1);
        }
        
        int counts = ratings.size();
        for(int i = 0; i < results.size(); i++)
            counts += results[i];
        return counts;
    }
};


猜你喜欢

转载自blog.csdn.net/qq_18124075/article/details/80789527
今日推荐