深圳罗湖网站设计公司,网页制作公司需要什么资质,自己注册一个公司需要多少钱,购物网页设计题目 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。
你需要按照以下要求#xff0c;给这些孩子分发糖果#xff1a;
每个孩子至少分配到 1 个糖果。 相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果#xff0c;计算并返回需要准…题目 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。
你需要按照以下要求给这些孩子分发糖果
每个孩子至少分配到 1 个糖果。 相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果计算并返回需要准备的 最少糖果数目 。
示例 1
输入ratings [1,0,2] 输出5 解释你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。 示例 2
输入ratings [1,2,2] 输出4 解释你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。 第三个孩子只得到 1 颗糖果这满足题面中的两个条件。 解题思路 首先从左往右遍历整个评分数组如果当前孩子的评分比前一个孩子高那么他的糖果数应该比前一个孩子多一个。这样可以确保相邻两个孩子中评分更高的孩子获得更多的糖果。 然后从右往左遍历整个评分数组如果当前孩子的评分比后一个孩子高并且他当前拥有的糖果数不多于后一个孩子那么他的糖果数应该比后一个孩子多一个。这样可以确保相邻两个孩子中评分更高的孩子获得更多的糖果。 最后计算所有孩子拥有的糖果总数即为所需准备的最少糖果数目。
代码实现
class Solution {
public:int candy(vectorint ratings) {int n ratings.size();vectorint candies(n, 1); // 初始化每个孩子至少分配到1个糖果// 从左往右遍历确保右边评分更高的孩子获得更多的糖果for (int i 1; i n; i) {if (ratings[i] ratings[i - 1]) {candies[i] candies[i - 1] 1;}}// 从右往左遍历确保左边评分更高的孩子获得更多的糖果for (int i n - 2; i 0; i--) {if (ratings[i] ratings[i 1]) {candies[i] max(candies[i], candies[i 1] 1);}}// 计算总糖果数int totalCandies accumulate(candies.begin(), candies.end(), 0);return totalCandies;}
};