首页 > 代码库 > Candy
Candy
Problem:Candy
There are N children standing in a line. Each child is assigned a rating value.
You are giving candies to these children subjected to the following requirements:
- Each child must have at least one candy.
- Children with a higher rating get more candies than their neighbors.
What is the minimum candies you must give?
思路:遍历两次,首先从左往右,只看左边的邻居,满足条件:如果ratings[i] > ratings[i-1],则candy_num_1[i] > candy_num_1[i-1]。然后从右往左,只看右边的邻居,满足条件:如果ratings[i] > ratings[i+1],则candy_num_2[i] > candy_num_2[i+1]。然后取两个数组中每个孩子分得的糖果数的较大值,则每个孩子所拥有的糖果数,既对其左邻居满足条件,又对其右邻居满足条件,且能保证分得的糖果总数最少。class Solution { public: int candy(vector<int> &ratings) { int n = ratings.size(); if(n == 0 || n == 1) return n; int sum = 0;//保存最少糖果的总数 int candy_num[n]; int cur_candy = 1; int i = 0; while(i < n)//初始化数组,每人至少分配一颗 { candy_num[i] = 1; i++; } for(i = 1; i < n; i++)//从左往右遍历 { if(ratings[i] > ratings[i-1]) candy_num[i] = candy_num[i-1] + 1; } sum = candy_num[n-1]; for(i = n-2; i > -1; i--)//从右往左遍历 { if(ratings[i] > ratings[i+1]) { cur_candy++; sum += max(cur_candy, candy_num[i]); } else { cur_candy = 1; sum += candy_num[i]; } } return sum; } int max(int a, int b) { return a>b?a:b; } };
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。