题目
到达终点的最大步数
给一个长度为n的数组nums,以及一个整数k,你的起点在下标0,终点在下标n-1,若i<j且abs(num[i]-num[j])<=k,则你可以从下标i跳到下标j。求到终点的最大步数,若无法到达终点,则返回-1.
输入:nums=[1,3,6,4,1] ,k=2 输出:3
输入:nums=[1,3,6,4,2] ,k=3 输出:5
代码
function getMaxSteps(nums,k){
let n=nums.length
let dp=New Array(n).fill(-1)
dp[0]=0
for (let i=1;i<n;i++){
for(let j=i-1;j>=0;j--){
if(Math.abs(nums[i]-nums[j]<=k && dp[j]!==-1)){
dp[i]=Math.max[dp[i],dp[j]+1]
}
}
}
return dp[n-1]
}
解析
在这个题目中,动态规划的思想是通过构建一个一维数组 dp 来解决问题。该数组的长度与输入数组 nums 的长度相同,dp[i]的值表示数组中达到第 i 个元素的最大步数。
动态规划的核心思想是利用已经计算过的子问题的解来求解更大规模的问题。在这个题目中,我们可以利用已经计算过的子数组的最大步数来计算当前位置的最大步数。
具体实现如下:
- 首先,定义变量 n 并赋值为数组 nums 的长度。
- 创建一个长度为 n 的数组 dp,并将所有元素初始化为 -1。dp 数组用于存储每个位置的最大步数。
- 将 dp 数组的第一个元素 dp[0] 初始化为 0,表示以第一个元素结尾的子数组中,最大步数为 0。
- 使用一个循环遍历数组 nums,从第二个元素开始(i=1)。
- 对于每个位置 i,内部循环从 i-1 开始向前遍历,直到第一个元素(索引为 0)。
- 在内部循环中,检查当前位置 i 与遍历位置 j 之间的差值是否不超过 k。
- 如果满足上述条件,更新当前位置 i 的最大步数 dp[i],取当前最大步数 dp[i] 和遍历位置 j 的最大步数 dp[j] 加 1 的较大值,即为到当前i位置的最大步数。
- 最后,返回 dp 数组的最大值,即为整个数组中相邻元素之间的最大步数。
通过这种动态规划的思想,我们可以避免重复计算,并且利用已经计算过的子问题的解来求解更大规模的问题,从而得到相邻元素之间的最大步数。