746. Min Cost Climbing Stairs

题目描述和难度

  • 题目描述:

数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost[i](索引从0开始)。

每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。

您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯。

示例 1:

输入: cost = [10, 15, 20]
输出: 15
解释: 最低花费是从cost[1]开始,然后走两步即可到阶梯顶,一共花费15。

 示例 2:

输入: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
输出: 6
解释: 最低花费方式是从cost[0]开始,逐个经过那些1,跳过cost[3],一共花费6。

注意:

  1. cost 的长度将会在 [2, 1000]
  2. 每一个 cost[i] 将会是一个Integer类型,范围为 [0, 999]

思路分析

求解关键:注意状态的定义。

参考解答

参考解答1:

  • 定义状态 dp[i] :第 i 层必须爬,消耗的体力花费最小值。
  • 根据状态的定义,要爬到第 len-1 层有两种选择:
  • (1)爬到 len-1 层,再上一层到楼顶
  • (2)爬到 len-2 层,再上两层到楼顶
public class Solution {

    public int minCostClimbingStairs(int[] cost) {
        int len = cost.length;
        if (len == 0) {
            return 0;
        }
        if (len == 1) {
            return cost[0];
        }
        if (len == 2) {
            return Integer.min(cost[0], cost[1]);
        }
        int[] dp = new int[len];
        dp[0] = cost[0];
        dp[1] = cost[1];
        for (int i = 2; i < len; i++) {
            dp[i] = cost[i] + Integer.min(dp[i - 1], dp[i - 2]);
        }
        return Integer.min(dp[len - 1], dp[len - 2]);
    }

    public static void main(String[] args) {
        int[] cost = {1, 100, 1, 1, 1, 100, 1, 1, 100, 1};
        Solution solution = new Solution();
        int minCostClimbingStairs = solution.minCostClimbingStairs(cost);
        System.out.println(minCostClimbingStairs);
    }
}

参考解答2

/**
 * 定义状态与状态转移方程:
 * dp[i]:爬到第 i 层(从 0 开始),需要花费的最少体力值
 * 需要说明的是:爬到这一层,不消耗这一层的体力值,因为这一层的体力值只表示向上跳要消耗的体力值
 * 很容易写出状态转移方程:
 * dp[i] = min(cost[i-1] + dp[i-1], cost[i-2] + dp[i-2])
 *
 * @author liwei
 */
public class Solution2 {

    public int minCostClimbingStairs(int[] cost) {
        int len = cost.length;
        if (len == 0) {
            return 0;
        }
        if (len == 1) {
            return cost[0];
        }
        if (len == 2) {
            return Math.min(cost[0], cost[1]);
        }
        int[] dp = new int[len + 1];
        // 注意:跳到第 0 阶和第 1 阶是不用消耗体力值的
        // 因为它们都可以作为跳台阶的起点(题目中说:在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯。)
        dp[0] = 0;
        dp[1] = 0;
        for (int i = 2; i <= len; i++) {
            dp[i] = Math.min(cost[i - 1] + dp[i - 1], cost[i - 2] + dp[i - 2]);
        }
        return dp[len];
    }
}

本篇文章的地址为 https://liweiwei1419.github.io/leetcode-solution/leetcode-0746-min-cost-climbing-stairs ,如果我的题解有错误,或者您有更好的解法,欢迎您告诉我 liweiwei1419@gmail.com