LeetCode之Candy

2014-11-24 08:30:46 · 作者: · 浏览: 0

【题目】

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

    【题意】

    有N个孩子站成一排。每个孩子都分配了一个等级值。 你把糖果给这些孩子受到以下要求:

    每个孩子都必须至少有一个糖果。 具有较高等级值的孩子们比他左右小伙伴获得更多糖果。 请问你至少拿多少糖果分配给孩子们?

    【分析】

    思路1:

    初始化所有小孩的糖果数目为1,从前往后扫描,如果第i个小孩的权值比第i-1个高,那么i的糖果数目等于i-1的糖果数目+1;从后往前扫描,

    如果第i个的小孩的权值比i+1个小孩高,但是糖果的数目却小或者相等,那么i的糖果数目等于i+1的糖果数目+1。该算法时间复杂度为O(N)

    【代码】

    /*********************************
    *   日期:2014-01-25
    *   作者:SJF0115
    *   题号: Candy
    *   来源:http://oj.leetcode.com/problems/candy/
    *   结果:AC
    *   来源:LeetCode
    *   总结:
    **********************************/
    #include 
        
         
    #include 
         
           #include 
          
            using namespace std; // 时间复杂度 O(n),空间复杂度 O(1) class Solution { public: int candy(vector
           
             &ratings) { int i; int n = ratings.size(); int result = 0; vector
            
              count(n); //每一个人至少一个糖果 for(i = 0;i < n;i++){ count[i] = 1; } // 左右各扫描一遍 //从左向右扫描 for(i = 1;i < n;i++){ //如果第i个小孩等级比第i-1个高,那么i的糖数目等于i-1的糖数目+1 if(ratings[i] > ratings[i-1]){ count[i] = count[i-1] + 1; } } //从右向左扫描 for(i = n-2;i >= 0;i--){ //如果第i个的小孩的权值比i+1个小孩高,但是糖的数目却小或者相等,那么i的糖数目等于i+1的糖数目+1。 if(ratings[i] > ratings[i+1] && count[i] <= count[i+1]){ count[i] = count[i+1] + 1; } } //统计糖果数量 for(i = 0;i < n;i++){ result += count[i]; } return result; } }; int main() { Solution solution; int result; vector
             
               ratings = {2,2}; result = solution.candy(ratings); printf("Result:%d\n",result); return 0; } 
             
            
           
          
         
        



    【测试】

    Input: [1,2,4,4,3]
    Expected: 9

    Input: [1,2,2]
    Expected: 4

    Input: [2,2]
    Expected: 2