candy

candy

title

原题目链接

几个小孩站一排,每个小孩有个等级值,现在给小孩发糖,发的时候要遵守2个规则:(1)每个小孩至少一颗糖(2)两个相邻的小孩中,等级大的小孩一定比等级小的小孩糖多,求发糖的数目的最小值

solution

最直接的想法就是,开始的时候给每个人一颗candy. 如果我比你高,我就比你多1,最低的孩子为1,从左往右扫瞄一次,波谷为1,然后依次加1到波峰,再到波谷时又是1,这样就满足所有rating高的比左边rating低的孩子的candy多了。然后再从右往左来一次,一样的,不弱还要多个条件就是,因为刚才算了一次candy[i]了,这次candy[i]要取最大的才能同同时满足这两个条件。然后就ok啦,两边都满足了

code

class Solution {  
    public:  
    int candy(vector<int> &ratings) {  
        // 在草稿纸上画一下ratings的曲线 
        int len = ratings.size();  
        int initVal = 1;  
        vector<int> num(len, initVal);  

        //nun[0] = 1; 
        for(int i = 1; i < len; i++) {  
             if(ratings[i] > ratings[i - 1]) {  
                 num[i] = num[i - 1] + 1;  
             }  
        }  

        for(int i = len - 2; i >= 0; i--) {  
            if(ratings[i] > ratings[i + 1]) {  
                if(num[i] == 1) {  
                    num[i] = num[i + 1] + 1;  
                } else {  
                    // reverse: note 
                    // 反向遍历时主要考虑峰值的情况 
                    num[i] = max(num[i], num[i + 1] + 1);  
                }  

                // 这里可以用num[i] = max(num[i], num[i + 1] + 1);来统一 
                // 毕竟num[i]==1的情况也在num[i] = max(num[i], num[i + 1] + 1);里面 
            }  
    }  

    int sum = 0;  
    for(int i = 0; i < len; i++) {  
        sum += num[i];  
    }  

    return sum;  
}  

};  

reference

author: 无聊蛋疼的1957写的低端博客

你可能感兴趣的:(C++)