您的位置:首页 > 其它

【leetcode】Candy

2015-08-01 23:36 471 查看

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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: