Day34|贪心算法|分发糖果

思路:

两个条件

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

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

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

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

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

如果ratingsi > ratingsi - 1那么i的糖果一定要比i - 1多一个:candyVeci = candyVeci - 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;
  }
}
相关推荐
Forever Nore5 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考7 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX7 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面8 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号8 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽8 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI8 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
地平线开发者10 小时前
征程6工具链模型X86推理方式说明
算法
地平线开发者10 小时前
【征程6】校准量化中HistogramObserver解析
算法
OuO-211 小时前
笔试强训 Day 34:ISBN 号码、kotori 和迷宫、矩阵最长递增路径
java·算法·矩阵