【每日力扣】70. 爬楼梯与746. 使用最小花费爬楼梯

在这里插入图片描述

🔥 个人主页: 黑洞晓威
😀你不必等到非常厉害,才敢开始,你需要开始,才会变的非常厉害。

70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 12 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶

示例 2:

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶

解题思路

  1. 定义一个数组 dp,其中 dp[i] 表示爬到第 i 阶楼梯的不同方法数。
  2. 初始状态为 dp[0] = 1(即爬到第 0 阶楼梯只有一种方法,就是不爬),dp[1] = 1(爬到第 1 阶楼梯只有一种方法,就是爬一阶)。
  3. 从第 2 阶楼梯开始,对于每一阶楼梯 i,可以选择从第 i-1 阶楼梯爬一阶到达,或者从第 i-2 阶楼梯爬两阶到达,因此状态转移方程为 dp[i] = dp[i-1] + dp[i-2]
  4. 最后返回 dp[n] 即可得到爬到第 n 阶楼梯的不同方法数。

代码实现

public class ClimbingStairs {
    public int climbStairs(int n) {
        if (n == 0 || n == 1) {
            return 1; // 初始状态,爬到第 0 阶或第 1 阶楼梯只有一种方法
        }

        int[] dp = new int[n + 1];
        dp[0] = 1;
        dp[1] = 1;

        for (int i = 2; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2]; // 状态转移方程
        }

        return dp[n];
    }

    public static void main(String[] args) {
        ClimbingStairs climbingStairs = new ClimbingStairs();
        int n1 = 2;
        int n2 = 3;
        System.out.println(climbingStairs.climbStairs(n1)); // Output: 2
        System.out.println(climbingStairs.climbStairs(n2)); // Output: 3
    }
}

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 。

解题思路

  1. 定义一个数组 dp,其中 dp[i] 表示爬到第 i 阶楼梯的最小花费。
  2. 初始状态为 dp[0] = cost[0]dp[1] = cost[1],因为可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯,所以初始状态直接使用 cost[0]cost[1]
  3. 从第 2 阶楼梯开始,对于每一阶楼梯 i,可以选择从第 i-1 阶楼梯爬一阶到达,或者从第 i-2 阶楼梯爬两阶到达,取两者中最小值,并加上当前阶梯的花费 cost[i],更新 dp[i]
  4. 最后返回 dp[n-1]dp[n-2] 中的最小值作为最终结果,因为可以选择从倒数第一阶或倒数第二阶出发。

代码实现

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

    public static void main(String[] args) {
        MinCostClimbingStairs solution = new MinCostClimbingStairs();

        // Test Case 1
        int[] cost1 = {10, 15, 20};
        int result1 = solution.minCostClimbingStairs(cost1);
        System.out.println("Test Case 1 Result: " + result1);  // Output: 15

        // Test Case 2
        int[] cost2 = {1, 100, 1, 1, 1, 100, 1, 1, 100, 1};
        int result2 = solution.minCostClimbingStairs(cost2);
        System.out.println("Test Case 2 Result: " + result2);  // Output: 6
    }
}

相关推荐

  1. 746.使用花费楼梯

    2024-03-26 13:36:05       60 阅读
  2. 746. 使用花费楼梯

    2024-03-26 13:36:05       67 阅读
  3. 746. 使用花费楼梯

    2024-03-26 13:36:05       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-26 13:36:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-26 13:36:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-26 13:36:05       82 阅读
  4. Python语言-面向对象

    2024-03-26 13:36:05       91 阅读

热门阅读

  1. Pandas 数据结构 - DataFrame

    2024-03-26 13:36:05       43 阅读
  2. maya 重定向 pycharm运行

    2024-03-26 13:36:05       42 阅读
  3. 找数字中的数据结构与算法

    2024-03-26 13:36:05       42 阅读
  4. 迷宫与陷阱(蓝桥杯)

    2024-03-26 13:36:05       44 阅读
  5. PHP面试基础题记录

    2024-03-26 13:36:05       30 阅读
  6. 【python】正则表达式

    2024-03-26 13:36:05       41 阅读
  7. OpencV图像几何形状绘制

    2024-03-26 13:36:05       46 阅读
  8. 面试算法-113-打家劫舍

    2024-03-26 13:36:05       39 阅读
  9. 计算机网络

    2024-03-26 13:36:05       36 阅读
  10. .什么是MyBatis?

    2024-03-26 13:36:05       37 阅读
  11. 设计模式(2):单例模式

    2024-03-26 13:36:05       38 阅读