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?

思路:

找出每一段单调递增1或者单调递减2或者都相同的序列3

case 1: 单调递增的第一个人的个数肯定是最小的,即1,因为在此序列之前,只能是单调递减或者是都相同的序列,因此第一个人的个数是1,后面递增

case 2: 单调递减的最后一个人肯定是最小的,即1,然后向前依次递增。到了最前面,即最大值以后,根据递增的大小和当前最前面目前的最大值来更新。

case 3:值都相同的一个序列 1 3 3 3 3 根据题意,其所对应的count值为1 2 1 1 1,即保证头尾的大小,中间的值均为最小值即可。

代码比较丑陋。。。这次WA了两次,第一次在count的初始化上,应该都初始化为1;第二次在for loop上面,我忘记把for括号里的i++拿掉了,因为i已经在for的大循环体中更新了自己的值,所以不需要再i++了。

class Solution {
public:
    int candy(vector<int> &ratings) {
        vector<int> count;
        for(int i=0;i<ratings.size();i++){
            count.push_back(1);
        }
        for(int i=0;i<ratings.size();){
            int k = i+1;
            if(k>=ratings.size())
                break;
            bool equal = false;
            while(k<ratings.size() && ratings[k]==ratings[k-1]){
                k++;
                equal = true;
            }
            if(equal){
                for(int j=i+1;j<k;j++)
                    count[j] = 1;
                i = k-1;
                continue;
            }
            bool big = false;
            while(k<ratings.size() && ratings[k]>ratings[k-1]){
                big = true;
                k++;
            }
            if(!big){
                while(k<ratings.size() && ratings[k]<ratings[k-1]){
                    k++;
                }
            }
            if(big){
                for(int j=i;j<k;j++)
                    count[j] = j-i+1;
            }else{
                for(int j=k-1;j>i;j--)
                    count[j] = k-j;
                count[i] = max(count[i],k-i);
            }
            i = k-1;
        }
        int sum = 0;
        for(int i=0;i<count.size();i++)
            sum+=count[i];
        return sum;
    }
};


======================================Modified on 5th, April, 2014================================

class Solution {
public:
    int candy(vector<int> &ratings) {
        vector<int> can;
        for(int i=0;i<ratings.size();i++)
            can.push_back(1);
        for(int i=0;i<ratings.size()-1;){
            int k = i+1;
            if(ratings[k]==ratings[i]){
                while(k<ratings.size() && ratings[k]==ratings[i])
                    k++;
                can[i] = max(can[i],1);
            }else if(ratings[k]>ratings[i]){
                while(k<ratings.size() && ratings[k]>ratings[k-1])
                    k++;
                for(int j=i;j<k;j++)
                    can[j] = j-i+1;
            }else{
                while(k<ratings.size() && ratings[k]<ratings[k-1])
                    k++;
                for(int j=k-1;j>i;j--)
                    can[j] = k-j;
                can[i] = max(can[i],k-i);
            }
            i = k-1;
        }
        int total = 0;
        for(int i=0;i<can.size();i++)
            total+=can[i];
        return total;
    }
};

 这下代码就工整的多了!

======================================Modified on 5th, April, 2014================================

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值