LeetCode 135.分发糖果(贪心算法)

简介: LeetCode 135.分发糖果(贪心算法)

135. 分发糖果


两次遍历(贪心算法

贪心策略:在每次遍历中,只考虑并更新相邻一侧的大小关系。


将相邻的孩子中,评分高的必须获得更多的糖果这句话拆分成2个规则


左规则:当ratings[i-1]<ratings[i]时,i号学生糖果数量比i-1号学生糖果数量多

右规则:当ratings[i]>ratings[i+1]时,i号学生糖果数量比i+1号学生糖果数量多


遍历数组2次,分别求满足左规则和右规则时,最少要分得的糖果数量。最终分得糖果数量即为这两个数量最大值。





class Solution
{
public:
    int candy(vector<int> &ratings)
    {
        vector<int> ans(ratings.size(), 1);
        int n = ans.size();
        for (int i = 1; i < n; i++)
        {
            if (ratings[i] > ratings[i - 1])
            {
                ans[i] = ans[i - 1] + 1;
            }
        }
        for (int i = n - 2; i >= 0; i--)
        {
            if (ratings[i] > ratings[i + 1])
            {
                // 左规则和有规则取最大值
                ans[i] = max(ans[i + 1] + 1, ans[i]);
            }
        }
        return accumulate(ans.begin(), ans.end(), 0);
    }
};


一次遍历


图中,第3列可以看作是1,2,3(绿色部分)的递增序列,也可以看作是3,4,5(蓝色部分)的递减序列。



修改序列,现在第3列不得不是4个糖果了。


依照上面的规律:


如果当前同学比上一个同学评价高,那么说明我们在递增序列中,直接分配该同学的糖果比前一个同学多一即可。

否则在递减序列中,我们可以默认递减序列的末尾是1,所以实际上是从尾到头递增。直接分配给当前同学一个糖果,并把该同学所在递减序列所有同学再多分配一个糖果。

如果当前递减序列长度和上一个递增序列等长时,需要把最近的递增序列的最后一个同学也并进递减序列中。如上图,第3列长度本为3,第4列长度也为3,按照定义,第4列评分<第3列评分,所以第3列长度大于第4列长度,因此第3列长度加1变为4。

class Solution
{
public:
    int candy(vector<int> &ratings)
    {
        int n = ratings.size();
        int ret = 1, pre = 1, inc = 1, dec = 0;
        for (int i = 1; i < n; i++)
        {
            if (ratings[i] >= ratings[i - 1])
            {
                dec = 0;
                pre = ratings[i] == ratings[i - 1] ? 1 : pre + 1;
                ret += pre;
                inc = pre;
            }
            else
            {
                dec++;
                if (dec == inc)
                {
                    dec++;
                }
                ret += dec;
                pre = 1;
            }
        }
        return ret;
    }
};
目录
相关文章
|
1月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
137 0
|
10月前
|
负载均衡 算法 安全
探秘:基于 C++ 的局域网电脑控制软件自适应指令分发算法
在现代企业信息化架构中,局域网电脑控制软件如同“指挥官”,通过自适应指令分发算法动态调整指令发送节奏与数据量,确保不同性能的终端设备高效运行。基于C++语言,利用套接字实现稳定连接和线程同步管理,结合实时状态反馈,优化指令分发策略,提升整体管控效率,保障网络稳定,助力数字化办公。
185 19
|
算法
优化策略:揭秘钢条切割与饼干分发的算法艺术
本文探讨了钢条切割与饼干分发两个经典算法问题,展示了算法在解决实际问题中的应用。钢条切割问题通过动态规划方法,计算出不同长度钢条的最大盈利切割方式,考虑焊接成本后问题更为复杂。饼干分发问题则采用贪心算法,旨在尽可能多的喂饱孩子,分别讨论了每个孩子一块饼干和最多两块饼干的情况。这些问题不仅体现了数学的精妙,也展示了工程师的智慧与创造力。
217 4
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
278 4
|
算法
测试工程师的技能升级:LeetCode算法挑战与职业成长
这篇文章通过作者亲身体验LeetCode算法题的过程,探讨了测试工程师学习算法的重要性,并强调了算法技能对于测试职业成长的必要性。
231 1
测试工程师的技能升级:LeetCode算法挑战与职业成长
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
174 6
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
192 2
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
181 1
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
196 1

热门文章

最新文章