力扣题目 509.斐波那契数
思路
- 很理所当然的,可以使用递归的方式
- 其次是用动态规划的方式,动态规划的核心就是递推公式。
- 那么递推和递归一字之差,有什么区别呢?(递推和递归的区别)
1、递归
java
class Solution {
//递归第一步:确定传入参数和返回值
public int fib(int n) {
//递归第二步:确定终止结果
if(n == 0)
return 0;
if(n == 1)
return 1;
//递归第三步:确定单层递归的逻辑
return fib(n-1) + fib(n-2);
}
}
2、动态规划
动态规划五部曲:
- 确定dp数组以及下标的含义------第i个数的斐波那契数值是dp【i】
- **确定递推公式------**dp【i】 = dp【i-1】+ dp【i-2】
- **dp数组的初始化------**dp【0】 = 0;dp【1】=1;
- **确定遍历顺序------**从公式可以看出,数组dp的 i 依赖于前面的 i-1 和 i-2 ,所以从前往后顺序
- **打印数组------**就是我们自己来举例模拟debug自己的代码是否正确
java
//非压缩版本
class Solution {
public int fib(int n) {
int[] dp = new int[n+1];
if(n <= 1){
return n;
}
else{
dp[0] = 0;
dp[1] = 1;
for(int i=2; i<=n; i++){
dp[i] = dp[i-1] + dp[i-2];
}
}
return dp[n];
}
}
java
//压缩版本
class Solution {
public int fib(int n) {
//int[] dp = new int[n+1];
if(n <= 1){
return n;
}
else{
//dp[0] = 0;
//dp[1] = 1;
int a=0, b=1, sum=0; //可以理解为a是i-2,b是i-1,sum是i
for(int i=2; i<=n; i++){
//dp[i] = dp[i-1] + dp[i-2];
sum = a+b;
a = b;
b = sum;
}
return sum;
}
//return dp[n];
}
}
力扣题目 746.使用最小花费爬楼梯
思路
- dp数组的含义------到达i位置时,花费的体力dp【i】
- 确定递推公式------因为 i 是由 i-1 或者 i-2 来得到的,所以 i = (i-1 + cost) 与 (i-2 + cost) 的最小的哪一个
- 确定初始值------因为直接从该位置起来不用花费体力,dp1 = 0;dp0 = 0
- 确定遍历顺序------ 因为 i 是由 i-1 或者 i-2 推理出来的,所以由前往后遍历
- 打印数组
java
class Solution {
public int minCostClimbingStairs(int[] cost) {
int length = cost.length;
int[] dp = new int [length + 1]; //这里+1是因为这个下标才是楼顶
//因为第一步直接从0或1开始,不用花费
dp[0] = 0;
dp[1] = 0;
//由提示可以看出,楼顶至少是下标为2
for(int i=2; i <= length; i++){
dp[i] = Math.min(dp[i-1] + cost[i-1],
dp[i-2] + cost[i-2]);
}
return dp[length];
}
}