【leetcode】Candy

Problem



Code

/*
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

 * 1、找出“兩邊高,中間低”的那個點,設爲1(可能有很多這樣的點);
 * 2、滿足“任意一個孩子都至少有一顆糖”,那麼就是從1中這些點出發,分別向兩邊遞增;
 * 3、每兩個點之間以較長的序列爲基準!
 */
void print(int nums[],int size){
    for(int i=0;i<size;++i)
        printf("%d ",nums[i]);
    printf("\n");
}

void fillSmallest(int *res,int *ratings,int ratingsSize){
    if(ratings[0]<=ratings[1])
        res[0] = 1;
    for(int i=1;i<ratingsSize-1;++i){
        if(ratings[i]<=ratings[i+1] && ratings[i]<=ratings[i-1])
            res[i] = 1;
    }
    if(ratings[ratingsSize-1]<=ratings[ratingsSize-2])
        res[ratingsSize-1] = 1;
}

void fillThePath(int *res,int *ratings,int size){
    int end = 0;
    for(int i=0;i<size;++i)
        if(res[i] == 1){
            end = i;
            break;
        }
    int beg;
    if(end==0)
        beg = 0;
    else
        beg = -1;
    int i;
    while(true){
        i =  beg+1;
        while(i<end && beg>=0){   //從左端到最高點
            if(ratings[i]>ratings[i-1])
                res[i] = res[i-1]+1;
            //else if(ratings[i]==ratings[i-1])
            //    res[i] = res[i-1];
            else
                break;
            ++i;
        }
        //printf("---------\nbeg: %d  end: %d\n",beg,end);
        //print(res,size);
        i = end-1;
        while(i>beg){        //從右端到最高點
            if(res[i]==0){  //還未到達最高點
                if(ratings[i]>ratings[i+1])
                    res[i] = res[i+1]+1;
                else if(ratings[i]==ratings[i-1])
                    res[i] = res[i+1];
                else
                    continue;       //這裏應該是到不了的
                --i;
            }else{      //達到左端規定的最高點
                if(end == size){
                    --i;
                    continue;
                }
                if(ratings[i]<=ratings[i+1])        //左端序列更長,以左端爲準
                    break;
                else{       //右端序列更長,以右端爲準
                    if(res[i]>res[i+1])
                        break;
                    //int tmp = res[i];
                    res[i] = res[i+1]+1;
                    --i;
                    /*
                    while(i>beg && tmp==res[i]){
                        res[i] = res[i+1];
                        --i;
                    }
                    */
                    break;
                }
                break;
            }
        }
        //print(res,size);
        //printf("---------\n");
        beg = end;
        i = end+1;
        if(end == size || end == size-1)   break;
        while(i<size){
            if(res[i]==1)   break;
            ++i;
        }
        end = i;
    }
}

int candy(int* ratings, int ratingsSize) {
    if(ratingsSize == 0)    return 0;
    if(ratingsSize == 1)    return 1;

    int *res = (int*)calloc(ratingsSize,sizeof(int));

    // 1
    fillSmallest(res,ratings,ratingsSize);
    //print(res,ratingsSize);

    // 2
    fillThePath(res,ratings,ratingsSize);

    //print(res,ratingsSize);

    // 計數
    int count = 0;
    for(int i=0;i<ratingsSize;++i)
        count += res[i];
    return count;
}
/*
int main(){
    int ratings[] = {1,2,1,2,3,4,5,6,8,5,4,5,6,7};
    int tmp[] = {2,1};
    printf("%d\n",candy(tmp,2));

    return 0;
}
*/

Result



Comment

      Hoo,although it is “hard” level.But if you have a clear thought, you will grab the key to solve it.
      seriously,I have tried 28 times…This told me : Coding everyday is important.
      It also teaches me : If you do it ,you’ll make it.

發佈了88 篇原創文章 · 獲贊 9 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章