如何使用多种算法解决LeetCode第135题——分发糖果问题

简介: 如何使用多种算法解决LeetCode第135题——分发糖果问题

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣!

期待与您一起探索技术、持续学习、一步步打怪升级 欢迎订阅本专栏❤️❤️

题目描述

老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:

  1. 每个孩子至少分到一个糖果。
  2. 评分更高的孩子必须比他两侧的邻位孩子获得更多的糖果。

你需要最少准备多少糖果。

示例 1:

输入: [1,0,2]
输出: 5
解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。

示例 2:

输入: [1,2,2]
输出: 4
解释: 你可以分别给这三个孩子分发 1、2、1 颗糖果。
     第三个孩子只得到 1 颗糖果,这满足题目要求。

方法一:两次遍历法

解题步骤

  1. 创建一个糖果数组,初始化每个孩子的糖果数为 1。
  2. 从左到右遍历,如果当前孩子的评分高于前一个孩子,则当前孩子的糖果数设置为前一个孩子的糖果数加一。
  3. 从右到左遍历,如果当前孩子的评分高于后一个孩子,并且当前孩子的糖果数不大于后一个孩子的糖果数,则当前孩子的糖果数设置为后一个孩子的糖果数加一。
  4. 返回糖果数组的总和。

Python 示例

def candy(ratings):
    n = len(ratings)
    candies = [1] * n
    # 从左到右遍历
    for i in range(1, n):
        if ratings[i] > ratings[i - 1]:
            candies[i] = candies[i - 1] + 1
    # 从右到左遍历
    for i in range(n - 2, -1, -1):
        if ratings[i] > ratings[i + 1] and candies[i] <= candies[i + 1]:
            candies[i] = candies[i + 1] + 1
    return sum(candies)
# Example usage
ratings = [1, 0, 2]
print(candy(ratings))  # Output: 5
ratings = [1, 2, 2]
print(candy(ratings))  # Output: 4

算法分析

  • 时间复杂度:O(N),其中 N 是孩子的数量。需要遍历两次数组。
  • 空间复杂度:O(N),用于存储糖果数量的数组。

算法图解与说明

考虑 ratings = [1, 0, 2]
初始化糖果数组:candies = [1, 1, 1]
左到右遍历:
索引1: 1 (评分 0) <= 0 (评分 1), 无变化
索引2: 2 (评分 2) > 0 (评分 0), 更新 candies[2] = candies[1] + 1 = 2
结果: candies = [1, 1, 2]
右到左遍历:
索引1: 0 (评分 1) > 0 (评分 1) 且 candies[1] <= candies[2], 无变化
索引0: 1 (评分 1) > 0 (评分 0), 更新 candies[0] = candies[1] + 1 = 2
结果: candies = [2, 1, 2]
总糖果数: 2 + 1 + 2 = 5

方法二:单次遍历法

解题步骤

  1. 创建一个糖果数组,初始化每个孩子的糖果数为 1。
  2. 使用一个标记数组来记录相邻孩子之间的关系(评分高的标记为 1,评分低的标记为 -1,相等标记为 0)。
  3. 单次遍历,根据标记调整糖果数,确保所有条件都满足。
  4. 返回糖果数组的总和。

Python 示例

def candy(ratings):
    n = len(ratings)
    if n == 0:
        return 0
    if n == 1:
        return 1
    candies = [1] * n
    for i in range(1, n):
        if ratings[i] > ratings[i - 1]:
            candies[i] = candies[i - 1] + 1
    for i in range(n - 2, -1, -1):
        if ratings[i] > ratings[i + 1]:
            candies[i] = max(candies[i], candies[i + 1] + 1)
    return sum(candies)
# Example usage
ratings = [1, 0, 2]
print(candy(ratings))  # Output: 5
ratings = [1, 2, 2]
print(candy(ratings))  # Output: 4

算法分析

  • 时间复杂度:O(N),其中 N 是孩子的数量。需要遍历两次数组。
  • 空间复杂度:O(1),只使用了常数级别的额外空间。

算法图解与说明

考虑 ratings = [1, 0, 2]
初始化糖果数组:candies = [1, 1, 1]
单次遍历:
从左到右遍历:
索引1: 1 (评分 0) <= 0 (评分 1), 无变化
索引2: 2 (评分 2) > 0 (评分 0), 更新 candies[2] = candies[1] + 1 = 2
结果: candies = [1, 1, 2]
从右到左遍历:
索引1: 0 (评分 1) > 0 (评分 1) 且 candies[1] <= candies[2], 无变化
索引0: 1 (评分 1) > 0 (评分 0), 更新 candies[0] = candies[1] + 1 = 2
结果: candies = [2, 1, 2]
总糖果数: 2 + 1 + 2 = 5

这两种方法都能有效地解决分发糖果的问题,确保每个孩子至少得到一颗糖果,并且评分更高的孩子比相邻孩子获得更多糖果。选择哪种方法可以根据具体场景和个人喜好而定。

🌹🌹如果觉得这篇文对你有帮助的话,记得一键三连关注、赞👍🏻、收藏是对作者最大的鼓励,非常感谢 ❥(^_-)

❤️❤️作者知识有限,如有错误,请各位大佬评论区批评指正,不胜感激❥(^_-)

相关文章
|
2月前
|
算法
测试工程师的技能升级:LeetCode算法挑战与职业成长
这篇文章通过作者亲身体验LeetCode算法题的过程,探讨了测试工程师学习算法的重要性,并强调了算法技能对于测试职业成长的必要性。
49 1
测试工程师的技能升级:LeetCode算法挑战与职业成长
|
2月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
39 6
|
2月前
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
55 2
|
2月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
41 1
|
2月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
40 1
|
2月前
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
65 0
|
2月前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
34 0
|
3天前
|
传感器 算法 C语言
基于无线传感器网络的节点分簇算法matlab仿真
该程序对传感器网络进行分簇,考虑节点能量状态、拓扑位置及孤立节点等因素。相较于LEACH算法,本程序评估网络持续时间、节点死亡趋势及能量消耗。使用MATLAB 2022a版本运行,展示了节点能量管理优化及网络生命周期延长的效果。通过簇头管理和数据融合,实现了能量高效和网络可扩展性。
|
1月前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
1月前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
下一篇
无影云桌面