力扣算法题目(跳跃游戏)

55,跳跃游戏

题目描述

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

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

判断你是否能够到达最后一个下标。

示例

输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 13 步到达最后一个下标。

输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。

题解

思路:

 - 1,使用贪心算法的方式(性能比较高)
 - 2,使用动态规划的方式

代码:

1,贪心的方式,

主要思路: 贪心的算法
遍历每一个元素的时候,都去探索它能到达的最远距离
去记录所能到达的元素的最后一个位置

var canJump = function(nums){
    let end = nums[0]
    // 遍历每一个元素
    for(let i = 1;i <nums.length;i++){
        // 如果中间出现断掉的情况,就说明到达不了该位置直接return
        if(i > end){
            return false
        }else{
            // 保存所能到达的最后一个位置
            end = Math.max(end, nums[i] + i)
        }     
    }
    return true
}

2,使用动态规划的方式

思路: 采用动态规划的思想
声明一个dp数组,dp[i]代表是否能到达该元素
状态转移公式:
dp[i] = dp[i - 1] && dp[i - 1] >= 1 …
主要就是判断该元素是不是可以通过之前的元素到达该元素

var canJump = function(nums) {
    const n = nums.length
    // 声明状态数组
    let dp = new Array(n).fill(false)
    // 初始化dp, 第一个肯定是会到达的
    dp[0] = true
    // 状态转移公式
    for(let i = 1;i < n;i++){
        for(let j = i - 1;j >= 0;j--){
            if(dp[j] && nums[j] >= i - j){
                dp[i] = true
                break
            }
        }
    }
    return dp[n - 1]
};

原题链接

原题链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值