509. 斐波那契数
题目描述
斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。
该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0F(1) = 1F(n) = F(n - 1) + F(n - 2),其中n > 1
输入: 一个整数 n
输出: 计算 F(n)
解题思路
-
动态规划
- 定义一个数组
dp,其中dp[i]表示第i项斐波那契数。 - 初始化
dp[0] = 0和dp[1] = 1。 - 根据递推公式:
dp[i] = dp[i-1] + dp[i-2],从小到大依次计算每一项。
- 定义一个数组
-
优化空间
- 由于计算
dp[i]时只需要dp[i-1]和dp[i-2],可以用两个变量代替数组,进一步优化空间复杂度。
- 由于计算
-
时间复杂度和空间复杂度
- 时间复杂度:O(n),因为计算每一项需要常数时间。
- 空间复杂度:
- 使用数组时为 O(n)。
- 优化为常量空间时为 O(1)。
Java代码
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 index = 2;index<=n;index++){
dp[index] = dp[index-1] + dp[index-2];
}
return dp[n];
}
}
70. 爬楼梯
题目描述
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。问:有多少种不同的方法可以爬到楼顶?
注意:
给定 n 是一个正整数。
解题思路
-
动态规划
- 定义一个数组
dp,其中dp[i]表示到达第i阶的方法数。 - 初始化:
dp[1] = 1(只爬 1 阶的方法)。dp[2] = 2(爬 2 阶的方法为[1+1]或[2])。
- 状态转移方程:
dp[i] = dp[i-1] + dp[i-2]。- 到达第
i阶的方法数等于从i-1阶爬 1 阶的方法数加上从i-2阶爬 2 阶的方法数。
- 到达第
- 定义一个数组
-
优化空间
- 由于计算
dp[i]时只需要dp[i-1]和dp[i-2],可以用两个变量代替数组,进一步优化空间复杂度。
- 由于计算
-
时间复杂度和空间复杂度
- 时间复杂度:O(n),因为需要遍历一次。
- 空间复杂度:
- 使用数组时为 O(n)。
- 优化为常量空间时为 O(1)。
Java代码
class Solution {
public int climbStairs(int n) {
if(n<3) return n;
int[] dp = new int[n+1];
dp[1] = 1;
dp[2] = 2;
for(int index = 3;index<=n;index++){
dp[index] = dp[index-1] + dp[index-2];
}
return dp[n];
}
}
746. 使用最小花费爬楼梯
题目描述
数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。
每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。
请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。
解题思路
-
动态规划
- 定义一个数组
dp,其中dp[i]表示到达第i阶的最小花费。 - 状态转移方程:
dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])- 即从
i-1阶或i-2阶爬到第i阶,选择花费最小的路径。
- 初始状态:
dp[0] = 0(从第 0 阶起始,无需花费)dp[1] = 0(从第 1 阶起始,无需花费)
- 定义一个数组
-
优化空间
- 由于计算
dp[i]只需要前两阶的结果,可以用两个变量代替数组,进一步优化空间复杂度。
- 由于计算
-
时间复杂度和空间复杂度
- 时间复杂度:O(n),因为需要遍历一次数组。
- 空间复杂度:
- 使用数组时为 O(n)。
- 优化为常量空间时为 O(1)。
Java代码
class Solution {
public int minCostClimbingStairs(int[] cost) {
int[] dp = new int[cost.length+1];
for(int ind = 2;ind < dp.length;ind++){
dp[ind] = Math.min(dp[ind-1]+cost[ind-1],dp[ind-2]+cost[ind-2]);
}
return dp[cost.length];
}
}

被折叠的 条评论
为什么被折叠?



