[杨小白]_java_leetcode 746. 使用最小花费爬楼梯

117 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!

746. 使用最小花费爬楼梯

746. 使用最小花费爬楼梯

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

示例1

输入:cost = [10,15,20]

输出:15

解释:你将从下标为 1 的台阶开始。

支付 15 ,向上爬两个台阶,到达楼梯顶部。

总花费为 15 。

示例2

输入:cost = [1,100,1,1,1,100,1,1,100,1]

输出:6

解释:你将从下标为 0 的台阶开始。

  • 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
  • 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
  • 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
  • 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
  • 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
  • 支付 1 ,向上爬一个台阶,到达楼梯顶部。 总花费为 6 。

2.解析

前两天写了斐波那契数和爬楼梯,都分享了两个做法,递归和记忆数组。今天继续复习这一知识点。想看前两题的点下面链接。本题只展示记忆数组做法。

# [杨小白]_java_leetcode 509.斐波那契数

# [杨小白]_java_leetcode 70.爬楼梯

2.1解法(记忆数组)

这里用db记忆数组,实现时间复杂度O(n),空间复杂度也是O(n),也完美的解决了栈溢出。

记录第k阶台阶前面所有台阶的最小花费,第k阶台阶的最小花费为min(db[k-1],db[k-2])+cost[k],依次循环到n阶台阶。其中第一阶台阶和第二节台阶的最小花费就是自身的值。

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int[] db = new int[cost.length];
        db[0] = cost[0];
        db[1] = cost[1];
        for(int i = 2; i < cost.length;i++) {
            db[i] = Math.min(db[i-1] + cost[i], db[i-2] + cost[i]);
        }
        return Math.min(db[cost.length-1],db[cost.length-2]);
    }
}

提交排名

image.png

3.结束

相信经过这三个题的记忆数组用法,大家一定对于这种简单的一维的递归优化有了深刻的理解,期间我又遇到了两个同样思想的题目,其中一个是二维记忆数组,一个是分析理解略负责,原理也是运用记忆数组的题,大家拭目以待吧。