题目链接 : https://leetcode-cn.com/problems/jump-game-ii/

题目描述:

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

示例:

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

思路:

思路一:

刚开始,我想用动态规划,用dp[i]表示到i位置的最少步数

动态方程为:dp[i] = min(dp[i], dp[j] + 1),j位置可以到达i 的位置,代码如下:

  1. class Solution:
  2. def jump(self, nums: List[int]) -> int:
  3. n = len(nums)
  4. dp = [float("inf")] * n
  5. dp[0] = 0
  6. for i in range(1, len(nums)):
  7. for j in range(i):
  8. if nums[j] >= i - j:
  9. dp[i] = min(dp[i], dp[j] + 1)
  10. #print(dp)
  11. return dp[-1]
  1. public class JumpGameII {
  2. public int jump(int[] nums) {
  3. if (nums == null || nums.length == 0) {
  4. return 0;
  5. }
  6. int[] dp = new int[nums.length];
  7. dp[0] = 0;
  8. for (int i = 1; i < nums.length; i++) {
  9. dp[i] = Integer.MAX_VALUE;
  10. for (int j = 0; j < i; j++) {
  11. if (nums[j] >= i - j) {
  12. dp[i] = Math.min(dp[i], dp[j] + 1);
  13. }
  14. }
  15. }
  16. return dp[nums.length - 1];
  17. }
  18. }

但是, 这是\(O(n^2)\)算法,如果数据超过\(10^4\)就过不了,没想到真的过不了,哈哈!

思路2: 贪心算法

类似与BFS

一句话解释: 从一个位置跳到它能跳到的最远位置之间的都只需要一步!

所以,如果一开始都能跳到,后面再跳到的肯定步数要变多!

时间复杂度:\(O(n)\)


关注我的知乎专栏,了解更多的解题技巧,共同进步!

代码:

python

  1. class Solution:
  2. def jump(self, nums: List[int]) -> int:
  3. n = len(nums)
  4. if n == 1 : return 0
  5. dp = [0] * n
  6. for i in range(n):
  7. for j in range(nums[i], 0, -1):
  8. if i + j >= n - 1 : return dp[i] + 1
  9. elif dp[i + j] == 0:
  10. dp[i + j] = dp[i] + 1
  11. else:
  12. break
  13. return "到底不了最后"

java

  1. class Solution {
  2. public int jump(int[] nums) {
  3. if (nums.length == 1) return 0;
  4. int[] dp = new int[nums.length];
  5. for (int i = 0; i < nums.length; i++) {
  6. for (int j = nums[i]; j > 0; j--) {
  7. if (i + j >= nums.length - 1) {
  8. return dp[i] + 1;
  9. } else if (dp[i + j] == 0) {
  10. dp[i + j] = dp[i] + 1;
  11. } else {
  12. break;
  13. }
  14. }
  15. }
  16. return 0;
  17. }
  18. }

[LeetCode] 45. 跳跃游戏 II的更多相关文章

  1. LeetCode 45. 跳跃游戏 II | Python

    45. 跳跃游戏 II 题目来源:https://leetcode-cn.com/problems/jump-game-ii 题目 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素 ...

  2. Java实现 LeetCode 45 跳跃游戏 II(二)

    45. 跳跃游戏 II 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: [ ...

  3. [leetcode] 45. 跳跃游戏 II(Java)(动态规划)

    45. 跳跃游戏 II 动态规划 此题可以倒着想. 看示例: [2,3,1,1,4] 我们从后往前推,对于第4个数1,跳一次 对于第3个数1,显然只能跳到第4个数上,那么从第3个数开始跳到最后需要两次 ...

  4. 力扣Leetcode 45. 跳跃游戏 II - 贪心思想

    这题是 55.跳跃游戏的升级版 力扣Leetcode 55. 跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃 ...

  5. leetcode 45. 跳跃游戏 II JAVA

    题目: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: [2,3,1,1, ...

  6. leetcode 55. 跳跃游戏 及 45. 跳跃游戏 II

    55. 跳跃游戏 问题描述 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1, ...

  7. LeetCode 45跳跃游戏&46全排列

    原创公众号:bigsai,回复进群加入力扣打卡群. 昨日打卡:LeetCode 42字符串相乘&43通配符匹配 跳跃游戏 题目描述: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中 ...

  8. 【LeetCode】跳跃游戏II

    [问题]给定一个非负整数数组,你最初位于数组的第一个位置.数组中的每个元素代表你在该位置可以跳跃的最大长度.你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: [,,,,] 输出: ...

  9. 45. 跳跃游戏 II

    给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: [2,3,1,1,4]输出 ...

随机推荐

  1. 通俗理解vue路由的导航钩子中关于next()

    1 背景:你乘坐汽车从A景区想赶往B景区(模拟路由A跳转到路由B) 1.next() 你乘坐汽车要从A景区到B景区,路过关卡时,守门人拦下你,你量出了next(),守门人一看没问题,赶紧放行,于是你顺 ...

  2. CodeChef DGCD Dynamic GCD

    CodeChef题面 Time limit 210 ms Code length Limit //内存限制也不说一下,真是的-- 50000 B OS Linux Language limit C, ...

  3. Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks(用于深度网络快速适应的元学习)

    摘要:我们提出了一种不依赖模型的元学习算法,它与任何梯度下降训练的模型兼容,适用于各种不同的学习问题,包括分类.回归和强化学习.元学习的目标是在各种学习任务上训练一个模型,这样它只需要少量的训练样本就 ...

  4. 目标检测:AlexNet

    AlexNet是2012年ImageNet竞赛冠军. 它是在CNN的基础上设计的,CNN(卷积神经网络)可谓是现在深度学习领域中大红大紫的网络框架,尤其在计算机视觉领域更是一枝独秀.CNN从90年代的 ...

  5. Python常用的库简单介绍一下

    Python常用的库简单介绍一下fuzzywuzzy ,字符串模糊匹配. esmre ,正则表达式的加速器. colorama 主要用来给文本添加各种颜色,并且非常简单易用. Prettytable ...

  6. QtCreator常用之快捷键

    1. Ctrl(按住)+ Tab快速切换已打开的文件 2. 自动添加成员函数实体(.cpp)定义: 将光标移动到h文件中的方法声明. 按Alt(按住)+ Enter,再按回车键 将在cpp中添加该函数 ...

  7. legend2---开发常用语句

    legend2---开发常用语句 一.总结 一句话总结: 其实敲代码都是很类似的,比如ajax,模型等等,敲代码就是一个由生到熟的过程 1.ajax? $.post("{:url('broa ...

  8. 惠普DL360G6安装ESXi主机后设置多块网卡

    需要先把服务器的网线连接到路由器 然后打开esxi设置网络的netwoork adapters 选中多块网卡,点确定保持 然后在到esxi客户端操作: 直接下一步 这里填上路由器分配的网段ip即可了

  9. 使用type在对象方法中调用类方法

    type简介 type在Python中的作用是创建一个类. 我们创建类的时候一般会使用这样的方法: # -*- coding:utf-8 -*- class Student(object): coun ...

  10. ubuntu 安汉google浏览器

    在终端中,输入以下命令: sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P /etc/apt/sources.list.d/   ...