代码随想录算法训练营第三十二天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
509. 斐波那契数
题目链接:https://leetcode.cn/problems/fibonacci-number/description/
文档讲解:https://programmercarl.com/0509.%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0.html
状态:已完成
思路:dp数组长度为n+1,
d
p
[
i
]
=
d
p
[
i
−
1
]
+
d
p
[
i
−
2
]
dp[i] = dp[i-1] + dp[i-2]
dp[i]=dp[i−1]+dp[i−2],
d
p
[
0
]
=
0
,
d
p
[
1
]
=
1
dp[0] = 0, dp[1] = 1
dp[0]=0,dp[1]=1
时间复杂度:
O
(
N
)
O(N)
O(N);空间复杂度:
O
(
N
)
O(N)
O(N)
class Solution {
public int fib(int n) {
if(n <= 1)
return n;
int[] dp = new int[n+1];
dp[0] = 0;
dp[1] = 1;
for(int i=2;i<=n;i++)
dp[i] = dp[i-1] + dp[i-2];
return dp[n];
}
}
70. 爬楼梯
题目链接:https://leetcode.cn/problems/climbing-stairs/description/
文档讲解:https://programmercarl.com/0070.%E7%88%AC%E6%A5%BC%E6%A2%AF.html
状态:已完成
思路:dp[i]表示到达第i个台阶的方法数量
- d p [ i ] = d p [ i − 1 ] + d p [ i − 2 ] dp[i] = dp[i-1] + dp[i-2] dp[i]=dp[i−1]+dp[i−2]
- d p [ 0 ] = 1 , d p [ 1 ] = 1 dp[0] = 1, dp[1] = 1 dp[0]=1,dp[1]=1
时间复杂度: O ( N ) O(N) O(N);空间复杂度: O ( N ) O(N) O(N)
// dp[i]表示到达第i个台阶的方法数量
// dp[i] = dp[i-1] + dp[i-2]
// dp[0] = 1, dp[1] = 1
class Solution {
public int climbStairs(int n) {
if(n == 1)
return 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];
}
}
746. 使用最小花费爬楼梯
题目链接:https://leetcode.cn/problems/min-cost-climbing-stairs/description/
文档讲解:https://programmercarl.com/0746.%E4%BD%BF%E7%94%A8%E6%9C%80%E5%B0%8F%E8%8A%B1%E8%B4%B9%E7%88%AC%E6%A5%BC%E6%A2%AF.html
状态:已完成
思路:dp[i] 到达第i个台阶的最低花费
- d p [ i ] = m i n ( d p [ i − 1 ] + c o s t [ i − 1 ] , d p [ i − 2 ] + c o s t [ i − 2 ] ) dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]) dp[i]=min(dp[i−1]+cost[i−1],dp[i−2]+cost[i−2])
- d p [ 0 ] = 0 , d p [ 1 ] = 0 dp[0] = 0, dp[1] = 0 dp[0]=0,dp[1]=0
- 此处的dp[0]是第一层台阶下面一层,没有实际含义,不要纠结这点
时间复杂度: O ( N ) O(N) O(N);空间复杂度: O ( N ) O(N) O(N)
// dp[i] 到达第i个台阶的最低花费
// dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])
// dp[0] = 0
// dp[1] = 0
class Solution {
public int minCostClimbingStairs(int[] cost) {
int n = cost.length;
if(n <= 1)
return 0;
int[] dp = new int[n+1];
for(int i=2;i<=n;i++)
dp[i] = Math.min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]);
return dp[n];
}
}