55,跳跃游戏
题目描述
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
示例
输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
输入: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]
};