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;
    }
};
View Code
原文地址:https://www.cnblogs.com/superzrx/p/3358285.html