LeetCode || Candy

来源:互联网 发布:mdf和ldf恢复数据库 编辑:程序博客网 时间:2024/06/16 00:23

Candy

 Total Accepted: 12392 Total Submissions: 68386My Submissions

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?

        特例:ratings为:1,3,3,4,3,2,1,0;那么candy数量应该为:1+2+2+5+4+3+2+1=20。分析其中的规律,rating相等的两个邻居candy数可以不等,我们只需要关注序列中连续的递减子序列的长度即可,比如本例中的 4,3,2,1,0,到达前四个人1,3,3,4显然我们分别应该给予1,2,3,4个candy,遇到第五个人3时,与前邻居4比是递减的,我们也给它1个,但是此时因为前邻居是4个,故不用加;接下来看2,我们给它1个,前邻居3也是1个,故应该给它加1个,但是前前邻居4是4个,故不用加;以此类推。。。

        由上述分析可以看出,我们需要记录递减子序列的长度descLen,以及子序列开头第一个人的candy数量descBegCan,在判断当前属于递减子序列的人的candy数时,我们并不能仅仅给当前candy总数加上这个长度,因为可能递减子序列的开头那个人(仅仅是开头这个人)本身已经有很多candy了,那么它不需要加1(就像上面判断到第五六个人3,2时,我们并不需要给第四个人4的candy数加1,因为它已经有了3个了,3>2>1 成立),而要看当前的长度descLen与descBegCan的大小关系,如果长度小于开头那个人的数量,那么仅加上长度减1 即可;如果二者相等,那么需要加上长度。

         代码如下:

class Solution {public:    int candy(vector<int> &ratings) {        int res=0;        int lastRat = -1, lastCan = 0,  can = 0;        int descLen = 0, descBegCan=0;  //连续递减子序列的长度和递减序列头部的值        for(int i=0; i<ratings.size(); ++i){            if(ratings[i]>lastRat){                can = lastCan+1;                descLen = 0;            }else if(ratings[i]==lastRat){  //相邻且rating相等的人candy可以不一样                can = 1;                descLen = 0;            }else{                can = 1;                if(descLen==0)                    descBegCan = lastCan;                descLen++;                                if(can==lastCan){                    if(descLen<descBegCan)                        res += descLen-1;                    else if(descLen==descBegCan){                        res += descLen;                        descBegCan++;                    }                }            }            res += can;            lastRat = ratings[i];            lastCan = can;        }        return res;    }};


本方法的空间复杂度为O(1),时间复杂度为O(n),应该属于最好的方法之一了。






0 0
原创粉丝点击