首页 > 编程语言 >力扣热题100_贪心算法_45_跳跃游戏

力扣热题100_贪心算法_45_跳跃游戏

时间:2024-08-28 21:52:30浏览次数:11  
标签:下标 nums 45 力扣 100 size 最优 dp 贪心

文章目录


题目链接

45. 跳跃游戏 II

给定一个长度为 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

解题思路

    # 贪心算法 与 动态规划算法的区别 :
    # 贪心算法
        # 1.贪心算法中,作出的每步贪心决策都无法改变,因为贪心策略是由上一步的最优解推导下一步的最优解,而上一步之前的最优解则不作保留;
        # 2.由(1)中的介绍,可以知道贪心法正确的条件是:每一步的最优解一定包含上一步的最优解。
    # 动态规划算法:
        # 1.全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解;
        # 2.动态规划的关键是状态转移方程,即如何由以求出的局部最优解来推导全局最优解;
        # 3.边界条件:即最简单的,可以直接得出的局部最优解。

    # 举个例子,比如跳到下标 i 最少需要 5 步,即 dp[i] = 5,那么必然不可能出现少于 5 步就能跳到下标 i + 1 的情况,
        # 续:跳到下标 i + 1 至少需要 5 步或者更多步。
    # 既然 dp[i] 是单调递增的,那么在更新 dp[i] 时,我们找到最早可以跳到 i 的点 j,从该点更新 dp[i]。
        # 续:即找到满足 j + nums[j] >= i 的第一个 j,使得 dp[i] = dp[j] + 1。
    # 而查找第一个 j 的过程可以通过使用一个指针变量 j 从前向后迭代查找。
    # 最后,将最终结果 dp[size - 1] 返回即可。

解题代码

class Solution:
    def jump(self, nums: List[int]) -> int:
        size = len(nums)
        dp = [float('inf') for _ in range(size)]
        dp[0] = 0

        j = 0
        for i in range(1, size):
            while j + nums[j] < i:
                j += 1
            dp[i] = dp[j] + 1
        
        return dp[size - 1]

参考资料:datawhalechina

标签:下标,nums,45,力扣,100,size,最优,dp,贪心
From: https://blog.csdn.net/weixin_42504788/article/details/141575950

相关文章

  • 【力扣】3145.大数组元素的乘积
    题目描述一个非负整数 x 的 强数组 指的是满足元素为2的幂且元素总和为 x 的最短有序数组。下表说明了如何确定 强数组 的示例。可以证明,x 对应的强数组是独一无二的。数字二进制表示强数组100001[1]801000[8]1001010[2,8]1301101[1,4,8]2310111[1,2,4,16]......
  • 代码随想录算法day24 | 贪心算法part02 | 122.买卖股票的最佳时机II,55. 跳跃游戏,45.跳
    122.买卖股票的最佳时机II本题解法很巧妙,本题大家可以先自己思考一下然后再看题解,会有惊喜!力扣题目链接(opensnewwindow)给定一个数组,它的第 i个元素是一支给定股票第i天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次......
  • 56. 合并区间【 力扣(LeetCode) 】
    一、题目描述  以数组intervals表示若干个区间的集合,其中单个区间为intervals[i]=[starti,endi]。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。二、测试用例示例1:输入:intervals=[[1,3],[2,6],[8,10],[15,18]]输......
  • 【Hot100】LeetCode—39. 组合总和
    目录1-思路2-实现⭐39.组合总和——题解思路3-ACM实现题目连接:39.组合总和1-思路注意如果借助startIndex实现,理解startIndex的含义在本题目中,由于同一个元素可以重复选取,因此startIndex在传递的过程中,不需要进行+1操作,传递的值为i2-实现⭐39......
  • 【Hot100】LeetCode—17. 电话号码的字母组合
    目录1-思路String数组(哈希表)+回溯2-实现⭐17.电话号码的字母组合——题解思路3-ACM实现题目连接:17.电话号码的字母组合1-思路String数组(哈希表)+回溯思路通过String数组实现哈希表,存储0-9的哈希表映射回溯三部曲①参数及返回值numToStr:Stri......
  • FlexAttention:解决二次复杂度问题,将大型视觉语言模型的输入提升至1008 | ECCV 2024
    \({\ttFlexAttention}\)是一种旨在增强大型视觉语言模型的方法,通过利用动态高分辨率特征选择和分层自注意机制,使其能够有效地处理并从高分辨率图像输入中获得优势,\({\ttFlexAttention}\)在性能和效率方面超越了现有的高分辨率方法。来源:晓飞的算法工程笔记公众号论文:F......
  • 力扣刷题---链表专题(超详细解析!!!)
    文章目录题目203.移除链表元素876.链表的中间结点024.反转链表21.合并两个有序链表面试题02.04分割链表面试题02.02.返回倒数第K个节点023.相交链表题目203.移除链表元素题目链接这个题目有两种方法,第一种是创建新的链表,然后将原链表遍历一遍,跳过所有值为val的......
  • 【Leetcode_Hot100】普通数组
    普通数组53.最大子数组和56.合并区间189.轮转数组238.除自身以外数组的乘积41.缺失的第一个正数53.最大子数组和方法一:暴力解依次遍历数组中的每个子数组,进而判断res的最大值超时classSolution{publicintmaxSubArray(int[]nums){intres=0;......
  • 力扣34
    classSolution{publicint[]searchRange(int[]nums,inttarget){intx=left(nums,target);if(x==-1){returnnewint[]{-1,-1};}else{returnnewint[]{x,right(nums,target)};}}......
  • 力扣35
    1.Java的二分查找publicintsearchInsert(int[]nums,inttarget){inti=0,j=nums.length-1;while(i<=j){intm=(i+j)>>>1;if(target<nums[m]){j=m-1;}......