Day34|贪心算法|分发糖果

思路:

两个条件

每个孩子至少分配到1个糖果。相邻的孩子中,评分高的孩子必须获得更多的糖果。

先比较一边,再比较另一边,两个分开考虑。

问的是"**至少"**需要准备多少。

局部:右边评分>左边评分,右边多得一个。

全局:相邻孩子中,评分高的右孩子获得比左孩子更多的糖果。

如果ratings[i] > ratings[i - 1]那么[i]的糖果一定要比[i - 1]多一个:candyVec[i] = candyVec[i - 1] + 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);
    }
}
//完整:
class Solutin{
public:
  int candy(vector<int>&ratings){
      vector<int>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;
  }
}
相关推荐
??tobenewyorker5 分钟前
力扣打卡第二十一天 中后遍历+中前遍历 构造二叉树
数据结构·c++·算法·leetcode
贾全26 分钟前
第十章:HIL-SERL 真实机器人训练实战
人工智能·深度学习·算法·机器学习·机器人
GIS小天41 分钟前
AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年7月4日第128弹
人工智能·算法·机器学习·彩票
满分观察网友z1 小时前
开发者的“右”眼:一个树问题如何拯救我的UI设计(199. 二叉树的右视图)
算法
森焱森2 小时前
无人机三轴稳定化控制(1)____飞机的稳定控制逻辑
c语言·单片机·算法·无人机
循环过三天2 小时前
3-1 PID算法改进(积分部分)
笔记·stm32·单片机·学习·算法·pid
闪电麦坤953 小时前
数据结构:二维数组(2D Arrays)
数据结构·算法
凌肖战3 小时前
力扣网C语言编程题:快慢指针来解决 “寻找重复数”
c语言·算法·leetcode
埃菲尔铁塔_CV算法3 小时前
基于 TOF 图像高频信息恢复 RGB 图像的原理、应用与实现
人工智能·深度学习·数码相机·算法·目标检测·计算机视觉
NAGNIP4 小时前
一文搞懂FlashAttention怎么提升速度的?
人工智能·算法