• 【LeetCode】45. 跳跃游戏 II


    1 问题

    给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。

    每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

    0 <= j <= nums[i]
    i + j < n
    返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。

    示例 1:

    输入: nums = [2,3,1,1,4]
    输出: 2
    解释: 跳到最后一个位置的最小跳跃数是 2。
    从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

    示例 2:

    输入: nums = [2,3,0,1,4]
    输出: 2

    2 答案

    自己写的,回溯算法,超出内存限制

    class Solution:
        def jump(self, nums: List[int]) -> int:
    
            def dfs(nums, start, path, res, target):
                if start < len(nums):
                    
                    if target == nums[start]:
                        res.append(path)
                    for i in range(1, nums[start]+1):
                        if nums[start]+i > target:
                            break
                        dfs(nums, start+nums[i], path+[nums[i]], res, target)
    
            path = []
            res = []
            dfs(nums, 0, path, res, len(nums))
            return len(res)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    修改后,还是对于特定的解,还是超出内存限制

    class Solution:
        def jump(self, nums: List[int]) -> int:
    
            def dfs(nums, start, path, res):
                if start > len(nums)-1:
                    return 
                if start == len(nums)-1:
                    res.append(path)
                    return
                for i in range(1, nums[start]+1):
                    if start+i > len(nums)-1:
                        break
                    dfs(nums, start+i, path+[nums[i]], res)
    
            path = []
            res = []
            dfs(nums, 0, path, res)
            ress = [len(res[i]) for i in range(len(res))]
            return min(ress)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    官方解,贪心算法

    class Solution:
        def jump(self, nums: List[int]) -> int:
            step, end, max_bound = 0, 0, 0
            for i in range(len(nums)-1):  # 只遍历到倒数第二个元素
                max_bound = max(max_bound, nums[i]+i)  # 上一索引最远位置和当前索引最远位置的较大者
                if (i==end):
                    step += 1
                    end = max_bound # 逐渐接近最后一个位置
            return step
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3 知识点

    贪心算法
    在每一步贪心选择中,只考虑当前对自己最有利的选择,而不去考虑在后面看来这种选择是否合理。

    https://blog.csdn.net/weixin_49370884/article/details/126247776

  • 相关阅读:
    4.3 IAT Hook 挂钩技术
    干货丨数据仓库工具hive面试题集锦
    TCP的三次握手和4次挥手
    python数据分析及可视化(十三)pyecharts可视化(简介、特性、全局配置项、图形的绘制、多图布局)
    代码混淆和加固,保障应用程序的安全性
    [QCM6125][Android13] 默认允许使用usb权限
    3D模型怎么贴法线贴图?
    【项目】短信模块对Java枚举的使用
    【iOS ARKit】PhysicsMotionComponent
    两表查询常用SQL
  • 原文地址:https://blog.csdn.net/CSDNLHCC/article/details/133917246