首页 > 其他分享 >45_jump Game II 跳跃游戏II

45_jump Game II 跳跃游戏II

时间:2024-05-12 22:23:05浏览次数:18  
标签:jump nums int 45 II dp size

45_jump Game II 跳跃游戏II

问题描述

链接:https://leetcode.com/problems/jump-game-ii/description/

You are given a 0-indexed array of integers nums of length n. You are initially positioned at nums[0].

Each element nums[i] represents the maximum length of a forward jump from index i. In other words, if you are at nums[i], you can jump to any nums[i + j] where:

  • 0 <= j <= nums[i] and
  • i + j < n

Return the minimum number of jumps to reach nums[n - 1]. The test cases are generated such that you can reach nums[n - 1].

解析:

给定一个数组nums,你被放在0这个位置上,nums[i]表示你最多能跳多远,求 跳到最后一个位置需要的最少步数 (假定全部测试样例可以跳到最后一个位置)

基本思想

这是一个初级的一维动态规划问题。

假设nums数组的大小为n,则构建长度为n的数组dp,其中\(dp[i]\) 表示 从0位置跳到i位置需要的最少步数,则 \(dp[i]\) 依赖于 dp[0 ~i-1], 假设 dp[t] 在t位置可以跳跃到i位置,且 dp[t]最小,则 \(dp[i] = dp[t] + 1\)

代码

C++

    int jump(vector<int>& nums) {
        int size = nums.size();
        if (size<=1) return 0;
        if (nums[0]<=0) return 0;
        vector<int> dp(size, 0); // dp[i] 表示 到达第i个位置需要的最少步数
        for(int i=1;i<size;++i) {
            int t = size;
            for(int j=0;j<i;++j) {
                if ((j+nums[j])>=i) {
                    t = min(dp[j]+1, t);
                }
            }
            dp[i] = t;
        }
        return dp[size-1];
    }

python

    def jump(self, nums: List[int]) -> int:
        size = len(nums)
        if size <= 1: return 0
        if nums[0] <= 0 : return 0
        dp = [0] * size
        for i in range(1, size):
            t = size
            for j in range(0, i):
                if (nums[j]+j) >= i:
                    t = min(t, dp[j]+1)
            dp[i] = t
        return dp[size-1]

标签:jump,nums,int,45,II,dp,size
From: https://www.cnblogs.com/douniwanli/p/18188286

相关文章

  • 代码随想录算法训练营第四天 | 23.两l两交换链表中的节点 19.删除链表的倒数第N个节点
    23.两两交换链表中的两个节点题目链接文章讲解视频讲解时间复杂度o(n)空间复杂度o(1)tips:画图,并将每一步操作用伪代码写出来,然后将代码理顺可以避免修改代码的麻烦初始化的时候就要将previous初始化为current的前一个节点,这样可以保证循环的第一步满足循环要求cla......
  • 代码随想录算法训练营第第二天 | 24. 两两交换链表中的节点 、19.删除链表的倒数第N
    两两交换链表中的节点用虚拟头结点,这样会方便很多。本题链表操作就比较复杂了,建议大家先看视频,视频里我讲解了注意事项,为什么需要temp保存临时节点。题目链接/文章讲解/视频讲解:https://programmercarl.com/0024.两两交换链表中的节点.html/***Definitionforsingly-li......
  • 55-jump Game 跳跃游戏
    问题描述Youaregivenanintegerarraynums.Youareinitiallypositionedatthearray'sfirstindex,andeachelementinthearrayrepresentsyourmaximumjumplengthatthatposition.Returntrueifyoucanreachthelastindex,orfalseotherwise解释......
  • hdu2045 递归水题
    这道题的解法就是站在涂色后的最后一块,思考前一块是怎么涂色的就可以了,比如如果最后一块的前一块是与第一块颜色不同的情况,则最后一块只有一种颜色可以涂,其方法的数目等于f(n-1),而当最后一块前面一块的颜色与第一块相同时,则倒数第三块一定与第一块的颜色不同,则涂到倒数第三块有f(n-......
  • pwn知识——劫持IO-file_jumps攻击和environ攻击
    导言哎,异或fd指针真是令人讨厌IO_file_jumps_IO_lock_t_IO_stdfile,_IO_wide_data(针对宽字节的虚函数表),_IO_FILE_plus(含有stdin,stdout)三者均被定义为IO_file_jumps原理IO_file_jumps是一个全局变量符号,存有以下符号这个结构体主要跟缓冲区有关,比如调用puts,fread,fgets,ex......
  • 雨天的尾巴(P4556 [Vani有约会] 雨天的尾巴)
    题目描述(简约版)N个点,形成一个树状结构。有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品。完成所有发放后,每个点存放最多的是哪种物品。注释很全,请耐心看一看,写了好久哒#include<bits/stdc++.h>usingnamespacestd;#definelsont[rt].ls#define......
  • 雨天的尾巴(P4556 [Vani有约会] 雨天的尾巴 /【模板】线段树合并)
    1.题意简化N个点,形成一个树状结构。有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品。完成所有发放后,每个点存放最多的是哪种物品。2.思路首先这道题肯定要用先建树,然后我们可以在树上的每个节点建一个权值线段树,考虑到空间问题(每个点都有1个权值......
  • DSP学习笔记之IIC
    IIC简介IIC总线是同步通信的一种特殊形式,是一种串行,半双工的通信,I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。IIC分为硬件IIC和软件IIC,DSP中有硬件IIC,但是不方便拓展,所以日常使用时使用软件IIC居多。IIC总线通信过程主机发送起始信号启用总线主机发送......
  • 杂题选讲II
    CliqueConnectAT_abc352_e朴素的想法是按题意暴力建边跑最小生成树,发现一个联通块内的很多边是冗余的,可以相邻两点建边跑最小生成树即可。//author:yhy#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;usingPii=pair<LL,LL>;constLLkMaxN......
  • 450. 删除二叉搜索树中的节点(leetcode)
    https://leetcode.cn/problems/delete-node-in-a-bst/要点是确定函数语义,单层递归逻辑,确定好有返回值的这种写法,分析出5种情况,递归的时候接收好递归的返回的新树的根节点即可classSolution{//函数语义(单层递归逻辑):查找要删除的节点,并且返回删除节点后新的树的......