202111-4更文-leetcode746:使用最小花费爬楼梯

286 阅读2分钟

这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

leetcode746-使用最小花费爬楼梯

前文

本文为菜鸟的刷题记录,仅用作笔记使用,并非最佳解决方案。

题目信息

数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。 每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。

解题思路分析

解法1

根据题目信息可知,该题为爬楼梯问题的一个变种思路。随着在楼梯上向上爬,每一节楼梯有不同的花费。而每次爬楼梯可以爬一层或两层。因此该问题也就转化为,通过第n-1层和第n-2层爬到第n层,哪种方案的花费更少。也就是目标花费可以认为是Math.min(cost[n-1] + f(n-1),cost[n-2]+f(n-2)),这也就是状态转移方程。只需要不停的通过比较目标项前两项的最少花费,加上对应点位的花费,取其中最小值即是最小花费。dp数组可以采用每个位置的最小花费值进行记录。而通过对空间复杂度进行优化,可以用两个变量分别表示目标项前两项的花费,以此方式将空间复杂度从o(n)优化为o(1)。由于第0,1项有所不同,因此需要对第0,1项进行单独计算,后续节点直接采用动态规划在循环中计算即可。至此,题目解析完毕。

public int minCostClimbingStairs(int[] cost) {
    int length = cost.length;
    if(length == 1){
        return cost[0];
    }else if(length == 2){
        return Math.min(cost[1],cost[0]);
    }
    int q = cost[0];
    int p = cost[1];
    int current = 0;
    for (int i = 2; i < cost.length ; i++) {
        current = Math.min(p,q) + cost[i];
        q = p;
        p = current;
    }
    return Math.min(current,q);
}

复杂度分析

  • 时间复杂度 o(n)
  • 空间复杂度 o(1)

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。