js算法-动态规划-小米2023秋招前端笔试真题

探讨如何利用动态规划求解数组中,允许步长k内跳跃的最大步数问题,给出详细代码和解析
摘要由CSDN通过智能技术生成

题目

到达终点的最大步数

给一个长度为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 个元素的最大步数。

动态规划的核心思想是利用已经计算过的子问题的解来求解更大规模的问题。在这个题目中,我们可以利用已经计算过的子数组的最大步数来计算当前位置的最大步数。

具体实现如下:

  1. 首先,定义变量 n 并赋值为数组 nums 的长度。
  2. 创建一个长度为 n 的数组 dp,并将所有元素初始化为 -1。dp 数组用于存储每个位置的最大步数。
  3. 将 dp 数组的第一个元素 dp[0] 初始化为 0,表示以第一个元素结尾的子数组中,最大步数为 0。
  4. 使用一个循环遍历数组 nums,从第二个元素开始(i=1)。
  5. 对于每个位置 i,内部循环从 i-1 开始向前遍历,直到第一个元素(索引为 0)。
  6. 在内部循环中,检查当前位置 i 与遍历位置 j 之间的差值是否不超过 k。
  7. 如果满足上述条件,更新当前位置 i 的最大步数 dp[i],取当前最大步数 dp[i] 和遍历位置 j 的最大步数 dp[j] 加 1 的较大值,即为到当前i位置的最大步数。
  8. 最后,返回 dp 数组的最大值,即为整个数组中相邻元素之间的最大步数。

通过这种动态规划的思想,我们可以避免重复计算,并且利用已经计算过的子问题的解来求解更大规模的问题,从而得到相邻元素之间的最大步数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值