218.贪心算法:分发糖果(力扣)

核心思想

  1. 初始化每个学生的糖果数为1
    • 确保每个学生至少有一颗糖果。
  2. 从左到右遍历
    • 如果当前学生的评分高于前一个学生,则当前学生的糖果数应比前一个学生多一颗。
  3. 从右到左遍历
    • 如果当前学生的评分高于后一个学生,则当前学生的糖果数应比后一个学生多一颗。
    • 同时确保当前学生的糖果数不小于先前分配的糖果数(在从左到右遍历时确定的)。
  4. 计算糖果总数
    • 累加每个学生的糖果数,得到最终的总数。

代码解决

cpp 复制代码
class Solution {
public:
    int candy(vector<int>& ratings) 
    {
        int result = 0;
        vector<int> candyNum(ratings.size(), 1); // 初始化每个学生的糖果数为1

        // 从左到右遍历,确保评分高的学生比前一个学生得到更多的糖果
        for (int i = 1; i < ratings.size(); i++)
        {
            if (ratings[i] > ratings[i - 1])
            {
                candyNum[i] = candyNum[i - 1] + 1;
            }
        }

        // 从右到左遍历,确保评分高的学生比后一个学生得到更多的糖果
        for (int i = ratings.size() - 2; i >= 0; i--)
        {
            if (ratings[i] > ratings[i + 1])
            {
                candyNum[i] = max(candyNum[i + 1] + 1, candyNum[i]);
            }
        }

        // 计算糖果总数
        for (int num : candyNum)
        {
            result += num;
        }

        return result;
    }
};

这段代码是一个名为`Solution`的类中的一个成员函数,其功能是计算一个整数数组`ratings`中的孩子根据他们的评分需要分配的最少糖果数量。具体处理方式如下:

  1. 函数声明为`int candy(vector<int>& ratings)`,表示该函数接受一个整数向量`ratings`作为参数,并返回一个整数值。

  2. `int result=0;`初始化一个名为`result`的整数变量,用于存储最终的结果,即所有孩子所需的最少糖果总数。

  3. `vector<int> candyNum(ratings.size(),1);`创建一个名为`candyNum`的整数向量,其大小与`ratings`相同,并将所有元素初始化为1。这个向量用于存储每个孩子分配到的糖果数量。

  4. 第一个for循环`for(int i=1;i<ratings.size();i++)`从索引1开始遍历`ratings`数组,直到数组末尾。在这个循环中,如果当前孩子的评分比他前一个孩子的评分高(`ratingsi>ratingsi-1`),则当前孩子的糖果数应该比前一个孩子的糖果数多1(`candyNumi=candyNumi-1+1;`)。

  5. 第二个for循环`for(int i=ratings.size()-2;i>=0;i--)`从数组倒数第二个元素开始向前遍历,直到数组开头。在这个循环中,如果当前孩子的评分比他后一个孩子的评分高(`ratingsi>ratingsi+1`),则当前孩子的糖果数应该是他后一个孩子的糖果数加1和他当前糖果数中的较大值(`candyNumi=max(candyNumi+1+1,candyNumi);`)。

  6. 第三个for循环`for(int num:candyNum)`遍历`candyNum`向量中的每个元素,将它们累加到`result`变量中,从而计算出所有孩子所需的最少糖果总数。

  7. 最后,函数返回`result`变量的值,即所有孩子所需的最少糖果总数。

总结来说,这个函数通过两次遍历和比较相邻孩子的评分来确定每个孩子应该分配到的最少糖果数,然后计算总和得到结果。这种算法确保了评分较高的孩子会得到更多的糖果,并且满足相邻孩子评分差异较大的孩子也会获得额外的糖果。

相关推荐
Asize12 分钟前
438. 找到字符串中所有字母异位词
算法
Asize19 分钟前
283. 移动零
算法
船厂电气自动化ai大模型2 小时前
AI大模型与数学·第57课 傅里叶全套工具链综合实战:串联级数/连续变换/DFT/FFT,图像、音频、扩散模型完整例题
数据结构·人工智能·深度学习·算法·机器学习
人工智能培训3 小时前
人工智能数据安全下的个人信息保护实践方案
大数据·人工智能·算法·生活
元启数宇4 小时前
幕墙AI设计算法逻辑:元启数宇如何智能分格
人工智能·算法
宵时待雨4 小时前
优选算法专题16:多源BFS
算法·宽度优先
重生之后端学习4 小时前
53. 最大子数组和[中等]✅
java·数据结构·算法·leetcode·职场和发展
INGNIGHT4 小时前
1908 · 布尔表达式求值(stack单调栈&dfs)
开发语言·c++·算法
lucas_AI5 小时前
把表格压成 64 个 token,长文档问答反而更准了:先找表,再看数
人工智能·深度学习·算法
Zzz 小生5 小时前
Lazy Theta*:把昂贵的视线检测留到“真正需要”时再做
人工智能·算法·贪心算法·推荐算法