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 阶
提示:
1 <= n <= 45
思路
首先确定dp数组的含义:dp[n]表示爬到n层楼需要的方法。
初始化dp数组:1层只有一种方法可以到达,所以初始化dp[1]=1,2层两种方法,dp[2]=2
得出递推公式:假设我们要到达n层,而n层必定是由n-2层爬两格或者n-1层爬一格到达,所以到达n层的方法就是到达n-1层的方法数加到达n-2层的方法数,此时n>2,dp[n]=dp[n-2]+dp[n-1]
然后递推算出dp数组的值即可。
代码
class Solution {public int climbStairs(int n) {int[] dp=new int[n+1];if(n==1){return 1;}dp[1]=1;dp[0]=1;for(int i=2;i<=n;i++){dp[i]=dp[i-2]+dp[i-1];}return dp[n];}}
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 <= cost.length <= 1000
0 <= cost[i] <= 999
思路
题目说可以选择下表为0或1的台阶开始爬楼梯,那么如果下表为1的台阶就是楼顶的话那么我们不需要花费即可爬到顶部,所以初始化dp[0]=dp[1]=0,这里dp数组的含义dp[i]就是到达i层楼梯的最低花费。
与上面题目相似的是,本题每次爬楼梯也只能爬1到两层,所以dp[i]必然由dp[i-2]&dp[i-1]得到,那么在考虑到本题每个阶梯都有对应cost,所以dp[i]=Math.min(dp[i-2]+cost[i-2],dp[i-1]+cost[i-1])
代码
class Solution {public int minCostClimbingStairs(int[] cost) {int n=cost.length;int[] dp=new int[n+1];if(n==1||n==0){return 0;}dp[0]=dp[1]=0;for(int i=2;i<=n;i++){dp[i]=Math.min(dp[i-2]+cost[i-2],dp[i-1]+cost[i-1]);}return dp[n];}
}