Kros的博客 Kros的博客
首页
  • CSS
  • 工具
  • Vue
  • js
  • Vue3
  • 算法
  • 折腾笔记
一言
  • 分类
  • 标签
  • 归档
码云

Kros

凡心所向,素履以往,生如逆旅,一苇以航
首页
  • CSS
  • 工具
  • Vue
  • js
  • Vue3
  • 算法
  • 折腾笔记
一言
  • 分类
  • 标签
  • 归档
码云
  • 每日算法

    • 信
    • 独一无二的出现次数
    • 按奇偶排序数组Ⅱ
    • 两数之和
    • 两数相加2
    • 寻找两个正序数组的中位数
    • 二叉树最大深度
    • 洗牌算法
    • 移动零
    • 数组元素排列组合
    • 上升下降字符
    • 最大间距
    • 四数相加2
    • 最大三角周长
    • 在排序数组中查找元素的起始位置
    • 最富有客户的资产总量
    • 打印规定循环字符串
    • 从m个数中选择n个数的组合
    • 复原IP地址
    • 有效的数独
    • 旋转图像
    • 缺失的第一个正整数
    • 第 N 个泰波那契数
    • 轮转数组
    • 爬楼梯
    • 斐波那契数列
    • 使用最小花费爬楼梯
    • 打家劫舍
    • 删除并获得点数
    • 颜色分类
    • 字母异分词分组
    • 加一
    • N叉树的层序遍历
    • N叉树的前序遍历
    • N叉树的后序遍历
    • N叉树的深度
    • 二叉树的中序遍历
    • 和并两个有序数组
    • 移除元素
    • 删除有序数组中的重复项Ⅱ
    • 多数元素
    • 找到数组的中间位置
    • 搜索插入位置
    • 最长连续序列
    • 三数之和
    • 找到字符串中所有字母异位词
    • 有效的括号
    • 最小栈
    • 求出硬币游戏的玩家
    • Find the odd int
    • Regex validate PIN code
    • Find the next perfect square
  • 折腾

  • 分享

  • 随笔
  • 每日算法
kros
2024-05-07

使用最小花费爬楼梯

题目:使用最小花费爬楼梯 给你一个整数数组cost,其中cost[i]是从楼梯第i个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 你可以选择从下标为0或下标为1的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。 遇到这种问题首先想到的就是使用递归,我们先把复杂问题简单化,

  • cost长度为1时,最小花费为0
  • cost长度为2时,最小花费为Math.min(cost[0], cost[1])
  • cost长度为3时,最小花费为Math.min(cost[0] + cost[2], cost[1])
  • cost长度为4时,最小花费为Math.min(cost.slice(0, cost.length - 1)的最小值+cost[cost.length - 1], cost.slice(0, cost.length - 2)的最小值+cost[cost.length - 2]) 通过观察上面的规律我们可以得出如下结论:最小花费可以简化成有没有包含最后一个台阶cost.length - 1,最后去两者的最小值,如下: 包含最后台阶:cost[cost.length - 1]加上cost.length - 2及以前台阶的最小值。 不包含最后台阶:cost[cost.length - 2])加上cost.length - 3,不包含最后台阶说明最后一步为length-2则剩余台阶为0到length-3
var minCostClimbingStairs = function(cost) {
  if (cost.length == 1 || cost.length == 0) return 0
  if (cost.length == 2) return Math.min(cost[0], cost[1])
  // 包含最后台阶
  let last = minCostClimbingStairs(cost.slice(0, cost.length - 1)) + cost[cost.length - 1]
  // 不包含最后台阶
  let noLast = minCostClimbingStairs(cost.slice(0, cost.length - 2)) + cost[cost.length - 2]
  return Math.min(last, noLast)
};
1
2
3
4
5
6
7
8
9

使用上面的递归方式十分浪费性能,这里同样使用动态规划来优化

 let arr = new Array(cost.length+1)
  arr[0] = 0,arr[1]=0
  for(let i = 2; i <= cost.length; i++) {
    arr[i] = Math.min(arr[i - 1] + cost[i - 1], arr[i - 2] + cost[i - 2])
  }
  return arr[cost.length]
1
2
3
4
5
6
上次更新: 2025/09/05, 8:09:00
斐波那契数列
打家劫舍

← 斐波那契数列 打家劫舍→

最近更新
01
Find the next perfect square
09-05
02
Regex validate PIN code
09-05
03
Find the odd int
09-05
更多文章>
Theme by Vdoing | Copyright © 2020-2025 kros king
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
icon-heart-o icon-heart icon-infinity icon-pause icon-play link next prev