LeetCode-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?
遇到上升段直接更新值,遇到下降段则记录下降开始点,从下一个开始上升点之前到下降点更新值
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; } };