题目链接:
链接:https://leetcode-cn.com/problems/candy
老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。
你需要按照以下要求,帮助老师给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
相邻的孩子中,评分高的孩子必须获得更多的糖果。
那么这样下来,老师至少需要准备多少颗糖果呢?
示例 1:
输入: [1,0,2]
输出: 5
解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。
示例 2:
输入: [1,2,2]
输出: 4
解释: 你可以分别给这三个孩子分发 1、2、1 颗糖果。
第三个孩子只得到 1 颗糖果,这已满足上述两个条件。
题解:
两次遍历,先将nums全部赋值为1,
先从左到右,如果ratings[i]>ratings[i-1],那么nums[i]=nums[i-1]+1
然后从右往左的时候,如果nums[i-1]>nums[i],那么比较nums[i]+1和nums[i-1],取较大的那个
1 int candy(int* ratings, int ratingsSize){ 2 int i,ans=0; 3 int nums[ratingsSize]; 4 if(ratingsSize == 0) 5 return 0; 6 for(int i=0 ;i <ratingsSize;i++) 7 nums[i] = 1; 8 for(i = 1; i<ratingsSize ; i++ ) 9 if(ratings[i] > ratings[i - 1] ) 10 nums[i] = nums[i - 1] + 1; 11 12 //for(i = 0 ;i < ratingsSize; i++) 13 //printf("%d ",nums[i]); 14 //puts(""); 15 for(i = ratingsSize - 1; i >= 1; i-- ) 16 if(ratings[i - 1] > ratings[i] ) 17 nums[i - 1] = max(nums[i] + 1,nums[i - 1]) ; 18 19 //for(i = 0 ;i < ratingsSize; i++) 20 // printf("%d ",nums[i]); 21 22 //puts(""); 23 for(i = 0 ;i < ratingsSize; i++) 24 ans += nums[i]; 25 26 return ans; 27 }