您的位置:首页 > 其它

LeetCode-Candy

2013-10-08 23:33 429 查看
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?

遇到上升段直接更新值,遇到下降段则记录下降开始点,从下一个开始上升点之前到下降点更新值

class Solution {
public:
int candy(vector<int> &ratings) {
if(ratings.size()==0)return 0;
if(ratings.size()==1)return 1;
if(ratings.size()==2){
if(ratings[0]==ratings[1])return 2;
else return 3;
}
vector<int> ca;
ca.resize(ratings.size(),-1);
bool up;
int start;
int i=0;
if(ratings[i]<=ratings[i+1]){
ca[i]=1;
up=true;
}
else{
up=false;
start=i;
}
i++;
while(true){
if(up){
if(ratings[i]<=ratings[i-1]){
up=false;
if(ratings[i]==ratings[i-1])start=i;
else start=i-1;
if(i==ratings.size()-1){
ca[i]=1;
for(int j=i-1;j>=start;j--)ca[j]=max(ca[j],ca[j+1]+1);
}
}
else{
ca[i]=max(ca[i],ca[i-1]+1);
}
}
else{
if(ratings[i]>=ratings[i-1]){
up=true;
ca[i-1]=1;
for(int j=i-2;j>=start;j--)ca[j]=max(ca[j],ca[j+1]+1);
if(ratings[i]==ratings[i-1]){
if(i+1<ratings.size()){
if(ratings[i+1]>=ratings[i]){
up=true;
ca[i]=1;
}
else{
up=false;
start=i;
}
}
else{
ca[i]=1;
}
}
else{
up=true;
ca[i]=2;
}
}
else{
if(i==ratings.size()-1){
ca[i]=1;
for(int j=i-1;j>=start;j--)ca[j]=max(ca[j],ca[j+1]+1);
}
}
}
i++;
if(i==ratings.size())break;
}
int sum=0;
for(int i=0;i<ratings.size();i++){
sum+=ca[i];
}
return sum;
}
};


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: