码迷,mamicode.com
首页 > 其他好文 > 详细

Candy

时间:2014-08-12 21:39:14      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   io   for   ar   div   

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?

思路:使用先递增后递减的规则遍历输入数组。递增过程中,每次给的糖果数从2增加到n;递减过程中,每次给的糖果数从1增加到m。若m+1>n,则说明递增序列与递减序列中间的最大值应该给m+1个,而实际我们只给了n个,因此应该在总糖果数上加上m-n+1。

 1 class Solution {
 2 public:
 3     int candy( vector<int> &ratings ) {
 4         if( ratings.size() <= 1 ) { return ratings.size(); }
 5         int prev = 1, i = 1, n_candy = 1, size = ratings.size();
 6         while( i < size ) {
 7             int num = 1;
 8             while( i < size && ratings[i] > ratings[i-1] ) { n_candy += ++num; ++i; }
 9             if( num != 1 ) { prev = num; }
10             num = 0;
11             while( i < size && ratings[i] < ratings[i-1] ) { n_candy += ++num; ++i; }
12             if( num+1 > prev ) { n_candy += num-prev+1; }
13             if( i < size && ratings[i] == ratings[i-1] ) { ++n_candy; ++i; prev = 1; }
14         }
15         return n_candy;
16     }
17 };

另一种方法通过依次向前、向后遍历确定每个child分配到的糖果的数目。向前遍历时,若序列递增(即ratings[i]<ratings[i+1]),则将分配的糖果数加1;向后遍历时,若序列递减(即ratings[i]>ratings[i+1]),则将分配的糖果数加1。注意:向后遍历时,当前的糖果数应该取向前遍历结果和向后遍历结果中的较大值。

 1 class Solution {
 2 public:
 3     int candy( vector<int> &ratings ) {
 4         if( ratings.size() <= 1 ) { return ratings.size(); }
 5         int size = ratings.size();
 6         vector<int> n_candy( size, 1 );
 7         for( int i = 1; i < size; ++i ) {
 8             if( ratings[i] > ratings[i-1] ) {
 9                 n_candy[i] = n_candy[i-1] + 1;
10             }
11         }
12         for( int i = size-2; i >= 0; --i ) {
13             if( ratings[i] > ratings[i+1] && n_candy[i] < n_candy[i+1] + 1 ) {
14                 n_candy[i] = n_candy[i+1] + 1;
15             }
16         }
17         int sum = 0;
18         for( int i = 0; i < size; ++i ) { sum += n_candy[i]; }
19         return sum;
20     }
21 };

 

Candy,布布扣,bubuko.com

Candy

标签:style   blog   color   使用   io   for   ar   div   

原文地址:http://www.cnblogs.com/moderate-fish/p/3907693.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!