动态规划篇:
一、509. 斐波那契数
思路:动态规划五部曲。根据本题的要求具体划分:
- 确定dp数组以及下标的含义:dp[i]的定义为:第i个数的斐波那契数值是dp[i]
- 确定递推公式:状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];
- dp数组如何初始化:dp[0] = 0, dp[1] = 1;
- 确定遍历顺序: 从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的
- 举例推导dp数组:
代码:文章来源地址https://www.toymoban.com/news/detail-405741.html
class Solution {
public int fib(int n) {
if (n <= 1) return n;
// 这里设置为n+1,因为0到n有n+1个数
int[] fib = new int[n + 1];
// 初始化
fib[0] = 0;
fib[1] = 1;
for (int i = 2; i <= n; i++) {
fib[i] = fib[i - 1] + fib[i - 2];
}
return fib[n];
}
}
二、70. 爬楼梯
注意:这个题的初始化存在争议,这里是默认dp[1]=1作为开头,不考虑dp[0]的情况。
public int climbStairs(int n) {
// 1.确定dp数组
int[] dp = new int[n + 1];
if (n <= 2) return n;
// 2.初始化dp数组, 这里不针对dp[0]做单独归一化
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) {
// 3.4. 确定递推公式 和 确定遍历顺序
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
三、746. 使用最小花费爬楼梯
注意:dp初始化 是dp[0] = 0,dp[1] = 0;
递推公式是dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
还有注意for循环中的i <=n。文章来源:https://www.toymoban.com/news/detail-405741.html
代码:
class Solution {
public int minCostClimbingStairs(int[] cost) {
int n = cost.length;
// dp[0] dp[1] 不算是楼梯里 所以索引是n + 1
// 也可以理解成0到n,一共有n+1个数
int[] dp = new int[n + 1];
// 初始化
dp[0] = 0;
dp[1] = 0;
// i <= n的意义在于最后要到楼顶,不是只在楼层上
for (int i = 2; i <= n; i++) {
dp[i] = Math.min(cost[i - 1] + dp[i - 1], cost[i - 2] + dp[i - 2]);
}
return dp[n];
}
}
到了这里,关于数据结构刷题(二十八):509斐波那契数、70爬楼梯、746 使用最小花费爬楼梯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!