老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。
你需要按照以下要求,帮助老师给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
相邻的孩子中,评分高的孩子必须获得更多的糖果。
那么这样下来,老师至少需要准备多少颗糖果呢?
示例 1:
输入: [1,0,2]
输出: 5
解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。
示例 2:
输入: [1,2,2]
输出: 4
解释: 你可以分别给这三个孩子分发 1、2、1 颗糖果。
第三个孩子只得到 1 颗糖果,这已满足上述两个条件。
Solution:
两种方法:
方法一:
使用一个数组先给每个人发一颗糖,然后比较每个人的右边,给右边的数大的加一颗糖,再比较左边,给左边大的数加一颗糖
1 class Solution { 2 public: 3 int candy(vector<int> &ratings) { 4 vector<int>v(ratings.size(), 1); 5 for (int i = 0; i < ratings.size() - 1; ++i) 6 if (ratings[i + 1] > ratings[i])v[i + 1] = v[i] + 1; 7 for (int i = ratings.size() - 1; i > 0; --i) 8 if (ratings[i - 1] > ratings[i])v[i - 1] = max(v[i - 1], v[i] + 1); 9 int res = 0; 10 for (auto a : v) 11 res += a; 12 return res; 13 } 14 };
方法二:
借助数学的排列组合来进行计算
1 class Solution { 2 public: 3 int candy(vector<int> &ratings) { 4 if (ratings.empty())return 0; 5 int res = 1, pre = 1, cnt = 0; 6 for (int i = 1; i < ratings.size(); ++i) 7 { 8 if (ratings[i] >= ratings[i - 1]) 9 { 10 if (cnt > 0)//需要向前追加的糖的个数 11 { 12 res += cnt * (cnt + 1) / 2; 13 if (cnt >= pre)res += cnt - pre + 1; 14 cnt = 0; 15 pre = 1; 16 } 17 pre = (ratings[i] == ratings[i - 1]) ? 1 : pre + 1; 18 res += pre; 19 } 20 else 21 ++cnt; 22 } 23 if (cnt > 0) 24 { 25 res += cnt * (cnt + 1) / 2; 26 if (cnt >= pre)res += cnt - pre + 1; 27 } 28 return res; 29 } 30 };
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/candy
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。