leetcode 135. 分發糖果 (相鄰的孩子中,評分高的必須糖果更多) 思維

小胖胖胖豬發表於2020-11-28

在這裡插入圖片描述

class Solution {
public:
    int candy(vector<int>& a) {
        int n=a.size(),sum=0;
        if(n<=1) return n;
        sum=1;
        //pre的用處就是假如[3,7]是下坡 pre的值就是之前3分配的高度,然後[4,7]小朋友分別對應0,-1,-2,-3 這些小朋友都要增加4個糖果,        //然後假如pre不大於等於5(第四個小朋友分配了0+4=4 所以第三個要>=5)的話,也要多給第3個小朋友分配糖果
        for(int i=0,pre=1;i<n-1;){
            if(a[i+1]>a[i]){
                int cnt=1;//第i個小朋友的糖果已經在之前的下坡或者等坡分配好了.
                while(i<n-1&&a[i+1]>a[i]) ++cnt,sum+=cnt,++i;//i+1(i還沒++之前的i+1)需要分配的糖果是cnt
                pre=cnt;//更新pre
                continue;
            }
            if(a[i+1]<a[i]){//i->i+1 就是下坡了,i現在分配的糖果是pre個
                int di=i,cnt=1;
                while(i<n-1&&a[i+1]<a[i]) --cnt,sum+=cnt,++i;//i+1(i還沒++之前的i+1)需要分配的糖果是cnt
                if(cnt<=0){
                    sum+=(i-di)*(1-cnt);//第[di+1,i]個每個人需要增加(1-cnt)個糖果
                    if(pre<1+1-cnt) sum+=1+1-cnt-pre;//多給第di個小朋友分配
                }//下坡之後不會是下坡(否則while不會跳出來),所以不需要更新pre
                continue;
            }
            if(a[i+1]==a[i]){//比如[1,5]等坡 那麼1是取原來的值,[2,5]都取1 然後5或許會被下坡更新(假如5緊跟一個下坡且1滿足不了)
                while(i<n-1&&a[i+1]==a[i]) sum+=1,++i;
                pre=1;//更新pre
                continue;
            }
        }
        return sum;
    }
};

class Solution {
public:
    int candy(vector<int>& a) {
        int n=a.size(),sum=0;
        if(n<=1) return n;
        sum=1;cout<<"第0個小朋友有1個糖果"<<endl;
        for(int i=0,pre=1;i<n-1;){
            if(a[i+1]>a[i]){
                cout<<i<<" --> "<<i+1<<"開始上坡了"<<endl;
                int cnt=1;//第i個小朋友的糖果已經在之前的下坡分配好了.
                while(i<n-1&&a[i+1]>a[i]){
                    ++cnt,sum+=cnt;//i+1需要分配的糖果是cnt
                    cout<<"第"<<i+1<<"個小朋友有"<<cnt<<"個糖果"<<endl;
                    ++i;
                }
                pre=cnt;
                continue;
            }
            if(a[i+1]<a[i]){//i->i+1 就是下坡了,i現在分配的糖果是pre個
                cout<<i<<" --> "<<i+1<<"開始下坡了"<<endl;
                int di=i,cnt=1;
                while(i<n-1&&a[i+1]<a[i]){
                    --cnt,sum+=cnt;//第i+1個小朋友分配cnt個
                    cout<<"第"<<i+1<<"個小朋友有"<<cnt<<"個糖果"<<endl;//可見第di+1以及往後分配是從0開始減的
                    ++i;
                }
                if(cnt<=0){
                    sum+=(i-di)*(1-cnt);//第[di+1,i]個每個人需要增加(1-cnt)個糖果
                    cout<<"第["<<di+1<<","<<i<<"]個小朋友每個人需要增加"<<1-cnt<<"個糖果"<<endl;
                    if(pre<1+1-cnt) {
                        //上面di+1及以後從0開始減 這裡的di取得就是1 本來應該是(1+1-cnt)的結果前面取了pre個 所以要增加
                        sum+=1+1-cnt-pre;
                        cout<<"第"<<di<<"個小朋友需要增加"<<1+1-cnt-pre<<"個糖果"<<endl;
                    }
                }
                continue;
            }
            if(a[i+1]==a[i]){
                cout<<i<<" --> "<<i+1<<"開始等坡了"<<endl;
                while(i<n-1&&a[i+1]==a[i]){
                    sum+=1;
                    cout<<"第"<<i+1<<"個小朋友有"<<1<<"個糖果"<<endl;
                    ++i;
                }
                pre=1;
                continue;
            }
        }
        return sum;
    }
};

相關文章