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

Candy

时间:2014-08-10 03:55:49      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   for   ar   问题   div   line   

Candy

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?

分析: 主要问题是可以从左升序或者从右升序,如何取大值。

方法一:从左从右分别计算一次,对值校正。并计算出最大值。要保存中间初步的值,空间复杂度:O(n)

class Solution {
public:
    int candy(vector<int> &ratings) {
        int n = ratings.size();
        if(n == 0) return 0;
        int totalCandy = 0;
        int *getCandy = new int[n];
        getCandy[0] = 1;
        for(int i = 1; i < n; ++i) 
            if(ratings[i] > ratings[i-1]) getCandy[i] = getCandy[i-1] + 1;
            else getCandy[i] = 1;
        totalCandy += getCandy[n-1];
        for(int i = n-1; i > 0; --i) {
            if(ratings[i-1] > ratings[i]) getCandy[i-1] = max(getCandy[i-1], getCandy[i]+1);
            totalCandy += getCandy[i-1];
        }
        delete[] getCandy;
        return totalCandy;
    }
};

方法二:从一个方向(此题从左),设置两个变量,通过计算升序长度,降序长度确定精确值。空间复杂度:O(1)

class Solution {
public:
    int candy(vector<int> &ratings) {
        int LA = 0, LD = 0; // 利用降序长度和升序长度,来求结果。
        bool decend = false;
        int totalCandy = ratings.size();
        for(int i = 1; i < ratings.size(); ++i) {
            if(ratings[i-1] < ratings[i]) {
                if(LA == 0 || decend == true) LA = 2;//考虑情况:之前为降序,重新设置升序长度
                else ++LA;
                LD = 0; decend = false; //升序时不需要知道之前降序长度。
                totalCandy += (LA - 1);
            }else if(ratings[i-1] > ratings[i]) {
                decend = true;
                if(LD == 0) LD = 2;
                else ++LD;
                if(LD <= LA) totalCandy += (LD - 2);
                else totalCandy += (LD - 1);
            }else {
                LA = LD = 0; // 出现相同字符,则从第二个重复字符重新开始
            }
        }
        return totalCandy;
    }
};

 

Candy,布布扣,bubuko.com

Candy

标签:style   blog   io   for   ar   问题   div   line   

原文地址:http://www.cnblogs.com/liyangguang1988/p/3902305.html

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