python 贪心算法 动态规划实现 跳跃游戏ll【力扣题45】

简介: python 贪心算法 动态规划实现 跳跃游戏ll【力扣题45】

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。

会一些的技术:数据分析、算法、SQL、大数据相关、python

欢迎加入社区:码上找工作

作者专栏每日更新:

LeetCode解锁1000题: 打怪升级之旅

python数据分析可视化:企业实战案例

备注说明:方便大家阅读,统一使用python,带必要注释,公众号 数据分析螺丝钉 一起打怪升级

题目描述

LeetCode 题目 45:跳跃游戏 II

题目描述

给定一个非负整数数组 nums,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度(如果值是2则可以选择0、1、2进行跳跃 最大不超过2)。你的目标是使用最少的跳跃次数到达数组的最后一个位置。

输入格式
  • nums:一个非负整数数组。
输出格式
  • 返回到达数组最后一个位置的最小跳跃次数。

示例

示例 1
输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
     从索引 0 跳到索引 1 的位置,跳1步,然后从索引 1 跳到索引 4,跳3步。
示例 2
输入: nums = [2,3,0,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
     从索引 0 跳到索引 1 的位置,跳1步,然后从索引 1 跳到索引 4,跳3步。

功能和约束

  • 数组 nums 的长度不超过 10^4。
  • 每个元素的大小不超过 1000。
  • 你可以假设总是可以到达数组的最后一个位置。

这个问题要求找到一个高效的方法来确定达到数组末尾的最少跳跃次数。我们可以通过不同的策略来解决这个问题,包括动态规划、贪心算法等,来尽可能地减少计算时间和空间消耗。

方法一:贪心算法(正向)

解题步骤
  1. 初始化变量
  • end 表示当前能跳到的最远边界。
  • farthest 表示所有可选择跳的位置中,能跳到的最远位置。
  • jumps 记录跳跃次数。
  1. 遍历数组:除了最后一个元素,因为一旦到达最后一个元素,不需要再跳跃。
  • 更新能跳到的最远位置 farthest
  • 如果到达了当前的 end,即边界,更新边界并增加跳跃次数。
  1. 返回跳跃次数
完整代码
def jump(nums):
    """
    使用贪心算法从前向后计算最少的跳跃次数
    :param nums: List[int], 每个位置可以跳跃的最大长度
    :return: int, 最少跳跃次数
    """
    n = len(nums)
    end = farthest = jumps = 0
    
    for i in range(n - 1):  # 最后一个元素不需要访问
        farthest = max(farthest, i + nums[i])  # 更新能到达的最远位置
        if i == end:  # 到达上一跳能到的边界了
            jumps += 1  # 增加跳跃次数
            end = farthest  # 更新边界为当前能到达的最远位置
            if end >= n - 1:  # 如果已经能跳到最后位置
                break
    
    return jumps
# 示例调用
print(jump([2, 3, 1, 1, 4]))  # 输出: 2
算法分析
  • 时间复杂度:(O(N)),其中 (N) 是数组长度。
  • 空间复杂度:(O(1)),使用了有限的额外空间。

方法二:动态规划

解题步骤
  1. 初始化数组:创建一个数组 dp,其中 dp[i] 表示到达第 i 个位置的最少跳跃次数。
  2. 填充数组:初始化一个非常大的数表示无法到达的位置。
  3. 逐步更新:对于每个位置,尝试通过之前的所有位置跳到当前位置,更新 dp[i]
  4. 返回结果dp[n-1] 即为到达最后位置的最少跳跃次数。
完整代码
def jump(nums):
    """
    使用动态规划计算到达最后位置的最少跳跃次数
    :param nums: List[int], 每个位置可以跳跃的最大长度
    :return: int, 最少跳跃次数
    """
    n = len(nums)
    dp = [float('inf')] * n
    dp[0] = 0
    
    for i in range(1, n):
        for j in range(i):
            if j + nums[j] >= i:
                dp[i] = min(dp[i], dp[j] + 1)
    
    return dp[-1]
# 示例调用
print(jump([2, 3, 1, 1, 4]))  # 输出: 2
算法分析
  • 时间复杂度:(O(N^2)),其中 (N) 是数组长度,每个元素需被重复访问和比较。
  • 空间复杂度:(O(N)),使用了一个与输入数组等长的 dp 数组。

方法三:贪心算法(反向)

解题步骤
  1. 初始化指针:从数组最后一个位置开始。
  2. 逆向查找:寻找最远可以一步跳到当前位置的起点。
  3. 更新位置:更新当前位置到找到的位置,增加跳跃次数。
  4. 重复执行:直到到达数组的开始位置。
完整代码
def jump(nums):
    """
    使用贪心算法从后向前计算最少的跳跃次数
    :param nums: List[int], 每个位置可以跳跃的最大长度
    :return: int, 最少跳跃次数
    """
    position = len(nums) - 1
    steps = 0
    
    while position > 0:
        for i in range(position):
            if i + nums[i] >= position:
                position = i
                steps += 1
                break
    
    return steps
# 示例调用
print(jump([2, 3, 1, 1, 4]))  # 输出: 2
算法分析
  • 时间复杂度:(O(N^2)),虽然是贪心算法,但在最坏情况下退化成平方级别的时间复杂度。
  • 空间复杂度:(O(1)),只使用了常数空间。

总结

下面的表格将展示它们在不同技术维度的性能和特点,包括时间复杂度、空间复杂度以及各自的优势和劣势。

特征 方法一:正向贪心算法 方法二:动态规划 方法三:反向贪心算法
时间复杂度 (O(N)) (O(N^2)) (O(N^2))
空间复杂度 (O(1)) (O(N)) (O(1))
优势 - 高效且直接
- 实现简单
- 理论上全面
- 易于理解和实现
- 无需预先知道全局信息
- 实现简单
劣势 - 需要合理选择跳跃策略 - 空间和时间消耗大
- 不适合大规模数据
- 时间复杂度高
- 可能多次迭代寻找最优点
适用场景 - 大规模数据
- 需要最优时间性能
- 数据规模较小
- 对执行时间要求不高
- 理解问题的另一种方式
- 数据规模较小

综合分析

方法一(正向贪心算法)

  • 这种方法通过从前往后贪心地选择每一跳的最远可达点,以最小化跳跃次数。其时间复杂度为线性,是解决此问题的最高效方法。适用于大规模数据,因为其空间复杂度极低。

方法二(动态规划)

  • 动态规划提供了一种全面检查所有可能性的方法,通过构建一个状态转移表来决定最少的跳跃次数。虽然这种方法在小规模数据上表现良好,但在大规模数据处理上由于其平方级时间复杂度表现不佳。

方法三(反向贪心算法)

  • 反向贪心算法从数组的末端开始向前搜索,寻找能到达末端的最远起点,然后逐步逆向缩减问题规模。这种方法的优点是实现简单,但与正向贪心算法相比,其效率较低,因为它在最坏情况下的时间复杂度也是平方级。

在选择合适的算法时,应根据具体的应用需求和问题规模做出决策。对于大规模的实际应用,正向贪心算法通常是最优的选择,因为它提供了最好的时间和空间效率。对于教学或者问题规模较小的场合,可以考虑动态规划或反向贪心算法,以便更好地理解问题的结构。


欢迎关注微信公众号 数据分析螺丝钉

相关文章
|
1月前
|
算法 Go 索引
【LeetCode 热题100】45:跳跃游戏 II(详细解析)(Go语言版)
本文详细解析了力扣第45题“跳跃游戏II”的三种解法:贪心算法、动态规划和反向贪心。贪心算法通过选择每一步能跳到的最远位置,实现O(n)时间复杂度与O(1)空间复杂度,是面试首选;动态规划以自底向上的方式构建状态转移方程,适合初学者理解但效率较低;反向贪心从终点逆向寻找最优跳点,逻辑清晰但性能欠佳。文章对比了各方法的优劣,并提供了Go语言代码实现,助你掌握最小跳跃次数问题的核心技巧。
94 15
|
28天前
|
算法 数据可视化 Python
Python中利用遗传算法探索迷宫出路
本文探讨了如何利用Python和遗传算法解决迷宫问题。迷宫建模通过二维数组实现,0表示通路,1为墙壁,'S'和'E'分别代表起点与终点。遗传算法的核心包括个体编码(路径方向序列)、适应度函数(评估路径有效性)、选择、交叉和变异操作。通过迭代优化,算法逐步生成更优路径,最终找到从起点到终点的最佳解决方案。文末还展示了结果可视化方法及遗传算法的应用前景。
|
1月前
|
存储 监控 算法
基于 Python 哈希表算法的局域网网络监控工具:实现高效数据管理的核心技术
在当下数字化办公的环境中,局域网网络监控工具已成为保障企业网络安全、确保其高效运行的核心手段。此类工具通过对网络数据的收集、分析与管理,赋予企业实时洞察网络活动的能力。而在其运行机制背后,数据结构与算法发挥着关键作用。本文聚焦于 PHP 语言中的哈希表算法,深入探究其在局域网网络监控工具中的应用方式及所具备的优势。
70 7
|
1月前
|
机器学习/深度学习 算法 Go
【LeetCode 热题100】139:单词拆分(动态规划全解析+细节陷阱)(Go语言版)
本题是 LeetCode 热题 139:单词拆分(Word Break),需判断字符串 `s` 是否能由字典 `wordDict` 中的单词拼接而成。通过动态规划(DP)或记忆化搜索解决。DP 中定义布尔数组 `dp[i]` 表示前 `i` 个字符是否可拆分,状态转移方程为:若存在 `j` 使 `dp[j]=true` 且 `s[j:i]` 在字典中,则 `dp[i]=true`。初始条件 `dp[0]=true`。代码实现中用哈希集合优化查找效率。记忆化搜索则从起始位置递归尝试所有切割点。两种方法各有利弊,DP 更适合面试场景。思考扩展包括输出所有拆分方式及使用 Trie 优化大字典查找。
61 6
|
1月前
|
存储 监控 算法
员工电脑监控场景下 Python 红黑树算法的深度解析
在当代企业管理范式中,员工电脑监控业已成为一种广泛采用的策略性手段,其核心目标在于维护企业信息安全、提升工作效能并确保合规性。借助对员工电脑操作的实时监测机制,企业能够敏锐洞察潜在风险,诸如数据泄露、恶意软件侵袭等威胁。而员工电脑监控系统的高效运作,高度依赖于底层的数据结构与算法架构。本文旨在深入探究红黑树(Red - Black Tree)这一数据结构在员工电脑监控领域的应用,并通过 Python 代码实例详尽阐释其实现机制。
45 6
|
1月前
|
算法 Go
【LeetCode 热题100】55:跳跃游戏(详细解析)(Go语言版)
本篇解析详细讲解了 LeetCode 热题 55——跳跃游戏(Jump Game)。通过判断是否能从数组起点跳至终点,介绍了两种高效解法:贪心算法和反向思维。贪心法通过维护最远可达位置 `maxReach` 实现一次遍历,时间复杂度 O(n),空间复杂度 O(1);反向法则从终点回溯,判断是否可到达起点。两者均简洁高效,适合面试使用。延伸题目如 LeetCode 45 进一步提升挑战。
75 7
|
1月前
|
运维 监控 算法
基于 Python 迪杰斯特拉算法的局域网计算机监控技术探究
信息技术高速演进的当下,局域网计算机监控对于保障企业网络安全、优化资源配置以及提升整体运行效能具有关键意义。通过实时监测网络状态、追踪计算机活动,企业得以及时察觉潜在风险并采取相应举措。在这一复杂的监控体系背后,数据结构与算法发挥着不可或缺的作用。本文将聚焦于迪杰斯特拉(Dijkstra)算法,深入探究其在局域网计算机监控中的应用,并借助 Python 代码示例予以详细阐释。
54 6
|
2月前
|
人工智能 编解码 算法
如何在Python下实现摄像头|屏幕|AI视觉算法数据的RTMP直播推送
本文详细讲解了在Python环境下使用大牛直播SDK实现RTMP推流的过程。从技术背景到代码实现,涵盖Python生态优势、AI视觉算法应用、RTMP稳定性及跨平台支持等内容。通过丰富功能如音频编码、视频编码、实时预览等,结合实际代码示例,为开发者提供完整指南。同时探讨C接口转换Python时的注意事项,包括数据类型映射、内存管理、回调函数等关键点。最终总结Python在RTMP推流与AI视觉算法结合中的重要性与前景,为行业应用带来便利与革新。
124 5
|
2月前
|
存储 监控 算法
基于 Python 哈希表算法的员工上网管理策略研究
于当下数字化办公环境而言,员工上网管理已成为企业运营管理的关键环节。企业有必要对员工的网络访问行为予以监控,以此确保信息安全并提升工作效率。在处理员工上网管理相关数据时,适宜的数据结构与算法起着举足轻重的作用。本文将深入探究哈希表这一数据结构在员工上网管理场景中的应用,并借助 Python 代码示例展开详尽阐述。
54 3
|
2月前
|
人工智能 监控 算法
Python下的毫秒级延迟RTSP|RTMP播放器技术探究和AI视觉算法对接
本文深入解析了基于Python实现的RTSP/RTMP播放器,探讨其代码结构、实现原理及优化策略。播放器通过大牛直播SDK提供的接口,支持低延迟播放,适用于实时监控、视频会议和智能分析等场景。文章详细介绍了播放控制、硬件解码、录像与截图功能,并分析了回调机制和UI设计。此外,还讨论了性能优化方法(如硬件加速、异步处理)和功能扩展(如音量调节、多格式支持)。针对AI视觉算法对接,文章提供了YUV/RGB数据处理示例,便于开发者在Python环境下进行算法集成。最终,播放器凭借低延迟、高兼容性和灵活扩展性,为实时交互场景提供了高效解决方案。
154 4