Candy

来源:互联网 发布:淘宝刷在线人数 编辑:程序博客网 时间:2024/06/06 03:03

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?


思路:

1.从左到右扫描,波谷为1,然后依次加1到波峰,再到波谷又是1.这样就能够保证,rating高的比左边rating低的糖果都要多。

2.从右到左扫描,同上。因为之前已经算过了依次,对于每个孩子要取candy[i]的最大,才能同时满足两个条件。

3,另外还要保证每个小孩都至少有一个糖果。

class Solution{public:static vector<int> candy(vector<int>&ratings){const int n = ratings.size();vector<int> candy(n);//从左向右扫描,遇到波谷设置为1,往波峰逐渐加1,到波谷有设置为1.这样保证,每rating高的要比rating低的糖果多。for(int i=1,incr=1;i<n;i++){if (ratings[i] > ratings[i-1])candy[i] = max(incr++,candy[i]);elseincr = 1;}//从右向左扫描。因为之前已经算过了依次,对于每个孩子要取candy[i]的最大,才能同时满足两个条件。for(int i = n-2,incr=1;i>=0;i--){if(ratings[i] > ratings[i+1])candy[i] = max(incr++,candy[i]);elseincr = 1;}//上面candy结果计算了步长。对于谷底无论从左还是从右,candy都不会赋值,会是0。因为每个小孩至少一个,所以需要加1。for(int i=0;i<candy.size();i++)candy[i]+=1;return candy;//计算糖果的总和//for(int i =0;i < n;i++)//{//sum += candy[i];//}//return sum;}};


0 0