要求的条件是:
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; } };
浙公网安备 33010602011771号