【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.
相关文章推荐
- Mac下VirtualBox虚拟机Win7与主机共享文件夹
- Android 动态生成对话框和EditText
- codefroces 266
- Nginx实现多个站点使用一个端口(配置Nginx的虚拟主机)
- HDU 5321 Beautiful Set
- 线程管理之线程创建和运行
- hdu5029 树链剖分 + 线段树
- hdu5067
- HDUOJ 1276 (士兵队列训练问题)(这道题有点坑)
- 初探JAVA
- iOS之UITextfield详细解析
- hdu 5126 cdq+Treap+BIT
- Leetcode: Valid Anagram
- xml复习
- XYZZY(SPFA变形:判断在有正负环的情况下如何找出最长路)
- 四元数
- category、protocol、delegate总结
- ViewDragHelper实现QQ5.0侧滑并处理与ViewPager的滑动冲突
- hdu5125 树状数组+dp
- 师大校赛D coloring Game 并查集