dedecms仿站教程,宜城营销型网站套餐,做网站电销,腾讯街景地图实景下载力扣135分发糖果 题目思路代码 题目
https://leetcode.cn/problems/candy/description/
老师想给孩子们分发糖果#xff0c;有 N 个孩子站成了一条直线#xff0c;老师会根据每个孩子的表现#xff0c;预先给他们评分。
你需要按照以下要求#xff0c;帮助老师给这些孩子… 力扣135分发糖果 题目思路代码 题目
https://leetcode.cn/problems/candy/description/
老师想给孩子们分发糖果有 N 个孩子站成了一条直线老师会根据每个孩子的表现预先给他们评分。
你需要按照以下要求帮助老师给这些孩子分发糖果
每个孩子至少分配到 1 个糖果。相邻的孩子中评分高的孩子必须获得更多的糖果。
那么这样下来老师至少需要准备多少颗糖果呢
示例 1:
输入: [1,0,2]输出: 5解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。
思路
先确定右边评分大于左边的情况也就是从前向后遍历 再确定左边大于右边的情况但是此时不能再从前向后遍历了 如图的解释判断左边大于右边从前向后遍历的时候得出的candyVec序列是1 2 1 2 1 1 1 如果还是从前向后遍历判断右边大于左边就会得到 1 2 1 2 2 2 2 的序列从评分为5的孩子看来应该比4高但是却没有得到更多的糖 根本原因就是图上的3 5 4判断加不加糖左和右是岔开的不能一样的遍历判断 这样逻辑会出问题。 还有一个就是从后向前遍历的时候candVec[i]的选取问题不能直接取candyVec[i 1] 1因为有可能candyVec本身就比他大再加的话不满足题目要求的最少糖果所以candyVec[i] max(candyVec[i], candyVec[i 1] 1)
代码
class Solution {
public:int candy(vectorint ratings) {vectorint candyVec(ratings.size(), 1);// 从前向后for (int i 1; i ratings.size(); i) {if (ratings[i] ratings[i - 1]) candyVec[i] candyVec[i - 1] 1;}// 从后向前for (int i ratings.size() - 2; i 0; i--) {if (ratings[i] ratings[i 1] ) {candyVec[i] max(candyVec[i], candyVec[i 1] 1);}}// 统计结果int result 0;for (int i 0; i candyVec.size(); i) result candyVec[i];return result;}
};