要求的条件是:

1、每个人最少一个糖果。

2、相邻的小朋友,要保证,评分高的比评分低的糖果多。

 

如果从一侧扫描的话,容易确定的就是递增序列,只要上升1个就够了。

容易出现问题的就是:遇到下降期,或者相邻的数相等,要怎么处理。

直接给1?或者减1?不行,搞不好可能出现负数。

 

比如  1  2  4  3  2  1  0  3  4  5  6

这种情况下,1~4每次只增加1,到后面递减的时候,右侧就会出现负数了。

但是,从最低值到最高值之前递增的那些,是正确的值。

 

具体方法:不是我自己想出来的,唉 惭愧啊!我不会做。看了好多提示,然后才做出来的。

1、初始化,所有的小朋友都是1.

2、从左到右扫描一遍,把上升期的先确定了。

3、从右到左扫描一遍,把上升期确定。遇到山峰的情况,取较大者。

rating:  1  2  4  3  2  1  0  3  4  5  6

initial:   1  1  1  1  1  1  1  1  1  1  1

candy:     2  3             2  3  4  5

candy:       5    4    3  2

 

上代码吧

class Solution {
public:
    int candy(vector<int>& ratings) {
        int n = ratings.size();
        vector<int> &a = ratings;
        
        if(n == 0)  return 0;
        
        vector<int> candies(n,1);   //初始都为1
        
        int i;
        for(i = 1; i < n; i++)
        {
            if(a[i] > a[i-1])   candies[i] = candies[i-1] + 1;
        }
        
        for(i = n-2; i >= 0; i--)
        {
            if(a[i] > a[i+1])   candies[i] = max(candies[i+1]+1, candies[i]);
        }
        
        int sum = 0;
        for(i = 0; i < n; i ++) sum += candies[i];
        
        return sum;
    }
};

 

posted on 2017-12-11 16:27  newbird2017  阅读(118)  评论(0)    收藏  举报