🔥 个人主页: 黑洞晓威
😀你不必等到非常厉害,才敢开始,你需要开始,才会变的非常厉害。
70. 爬楼梯
假设你正在爬楼梯。需要 n
阶你才能到达楼顶。
每次你可以爬 1
或 2
个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
解题思路
- 定义一个数组
dp
,其中dp[i]
表示爬到第i
阶楼梯的不同方法数。 - 初始状态为
dp[0] = 1
(即爬到第 0 阶楼梯只有一种方法,就是不爬),dp[1] = 1
(爬到第 1 阶楼梯只有一种方法,就是爬一阶)。 - 从第 2 阶楼梯开始,对于每一阶楼梯
i
,可以选择从第i-1
阶楼梯爬一阶到达,或者从第i-2
阶楼梯爬两阶到达,因此状态转移方程为dp[i] = dp[i-1] + dp[i-2]
。 - 最后返回
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 。
解题思路
- 定义一个数组
dp
,其中dp[i]
表示爬到第i
阶楼梯的最小花费。 - 初始状态为
dp[0] = cost[0]
,dp[1] = cost[1]
,因为可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯,所以初始状态直接使用cost[0]
和cost[1]
。 - 从第 2 阶楼梯开始,对于每一阶楼梯
i
,可以选择从第i-1
阶楼梯爬一阶到达,或者从第i-2
阶楼梯爬两阶到达,取两者中最小值,并加上当前阶梯的花费cost[i]
,更新dp[i]
。 - 最后返回
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
}
}