首页 > 其他分享 >动态规划02——45. 跳跃游戏 II

动态规划02——45. 跳跃游戏 II

时间:2023-04-13 11:37:17浏览次数:42  
标签:02 位置 nums int 45 II 跳跃 position dp

45. 跳跃游戏 II

给定一个长度为 n0 索引整数数组 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 <= nums.length <= 104
  • 0 <= nums[i] <= 1000
  • 题目保证可以到达 nums[n-1]

方法一:动态规划(计算每个点的松弛范围)

class Solution {
    public int jump(int[] nums) {
        int n = nums.length;
        int[] dp = new int[n];
        //初始化dp数组
        dp[0] = 0;
        for (int i = 1; i < n;++i) {
            dp[i] = n+1;
        }
        //遍历整个数组,计算到每个点的最小跳跃次数
        for (int i = 0;i < n;++i) {
            // 找到每个跳跃点能够松弛的范围(即从它出发到它用完跳跃次数的范围)
            for (int j = 1;j <= nums[i];++j) {
                if (i+j >= n) {
                    //最先到达最后元素的dp一定是最小的(因为前面的每一次都已经找到了最小的)
                    return dp[n-1];
                }
                dp[i+j] = Math.min(dp[i+j],dp[i]+1);
            }
        }
        return dp[n-1];
    }
}

方法二:贪心算法(从后往前)

思路:我们的目标是到达数组的最后一个位置,因此我们可以考虑最后一步跳跃前所在的位置,该位置通过跳跃能够到达最后一个位置。

如果有多个位置通过跳跃都能够到达最后一个位置,那么我们应该如何进行选择呢?直观上来看,我们可以「贪心」地选择距离最后一个位置最远的那个位置,也就是对应下标最小的那个位置。因此,我们可以从左到右遍历数组,选择第一个满足要求的位置。

找到最后一步跳跃前所在的位置之后,我们继续贪心地寻找倒数第二步跳跃前所在的位置,以此类推,直到找到数组的开始位置。

class Solution {
    public int jump(int[] nums) {
        int position = nums.length - 1;
        int steps = 0;
        while (position > 0) {
            for (int i = 0; i < position; i++) {
                if (i + nums[i] >= position) {
                    position = i;
                    steps++;
                    break;
                }
            }
        }
        return steps;
    }
}

 

标签:02,位置,nums,int,45,II,跳跃,position,dp
From: https://www.cnblogs.com/fulaien/p/17312851.html

相关文章

  • android: 平台版本对应api及占比统计(android studio 2022.1.1)
    一,查看平台版本对应的api官方文档地址:https://developer.android.google.cn/guide/topics/manifest/uses-sdk-element.html?utm_campaign=adp_series_sdkversion_010616&utm_source=medium&utm_medium=blog&hl=zh-cn#ApiLevels如图: 二,查看各版本的支持比率:启动androi......
  • Ethernet II Frame 协议格式
    以太网帧有多种标准,每个标准有细微区别。最常见的是EthernetII标准,除此之外还有NovellrawIEEE802.3|IEEE802.2LLC|IEEE802.2SNAP。帧头格式DestMACSrcMACEthernetTypeDataCRC6bytes6bytes2bytes46-1500bytes4bytesDestMAC目标MAC地址,MAC......
  • MATLAB代码:基于NSGA-II的风光水多能互补协调优化调度
    MATLAB代码:基于NSGA-II的风光水多能互补协调优化调度关键词:NSGA-II算法多目标优化水电-光伏多能互补  参考文档:《店主自写文档》基本复现;仿真平台:MATLAB主要内容:代码主要做的是基于NSGA-II的水电-光伏互补系统协调优化模型,首先,结合水电机组的运行原理以及运行方式,构建了......
  • 【剑指 Offer】 56 - II. 数组中数字出现的次数 II
    【题目】在一个数组nums中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。示例1:输入:nums=[3,4,3,3]输出:4示例2:输入:nums=[9,1,7,9,7,9,7]输出:1 限制:   1<=nums.length<=10000   1<=nums[i]<2^31 来源:力扣(LeetCode)链接:http......
  • CodeStar2023年春第4周周赛普及奠基组
    T1:字符串加密(二)本题难度简单,是一个模拟题,注意\(k\)可能非常大,需要先模\(26\)。代码实现#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;intmain(){stringm;cin>>m;llk;cin>>k;k%=26;stringans;......
  • 链表应用 II
    目录链表应用II应用2:Leetcode.25题目分析代码实现链表应用II应用2:Leetcode.25题目25.K个一组翻转链表输入:\(head=[1,2,3,4,5]\),\(k=2\)输出:\([2,1,4,3,5]\)分析这里,我们以前面题目中的用例,来说明算法的步骤。为了避免讨论边界条件,这里,我们使用一个\(dummy\)......
  • P8816 [CSP-J 2022] 上升点列
    P8816[CSP-J2022]上升点列欧几里得距离\(h=\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}\) 。横坐标、纵坐标值均单调不减,A点可向上和向右。①不连接,用上所有点,序列长度为\(j+1\)。②从A点向前枚举(1)判断点是否合法(2)所用点\(j\leK\).01背包与最长子序列结合:\(f[i][j]\)表示......
  • 每日总结2023-04-12
    今天对项目目前进度做了总结,并针对当前的任务做了思路说明以及调整,在每日站立会议中,我充分了解了目前项目所需要完成的部分。今天针对这些内容做出了调整。1.新增数据库,内容为用户购买的商品,主键为商家绑定信息,根据这些信息可以算出每日总收益。2.绘制出补货的具体页面。3.写......
  • 2023.4.12.汇报.pptx
    6月份汇报想法  8月份写论文 ==========================================================           ......
  • 【LeeCode】213. 打家劫舍 II
    【题目描述】你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房......