509.斐波那契数列
题目链接:509. 斐波那契数 - 力扣(LeetCode)
解题思路:
动态规划恢复记忆的第一题!继续冲,找感觉。主要是回忆动态规划五部曲
class Solution {
public int fib(int n) {
/**
* 动态规划:
* 1.确认dp数组及下标含义 dp[i] 表示当前位置的斐波那契数列值
* 2.确认递推关系式 dp[i] = dp[i - 1] + dp[i - 2]
* 3.如何初始化dp数组 dp[0] = 0 dp[1] = 1
* 4.确认dp数组遍历顺序 从前向后
* 5.模拟过程
*/
if(n == 0 || 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.爬楼梯
解题思路:
还是动态规划那五部曲,唯一需要注意的就是dp[0] 走到第0个台阶需要1步这个事。这样还是很牵强。。可以让dp[1] dp[2]作为初始值
class Solution {
public int climbStairs(int n) {
/**
* 1.dp数组及其下标含义 搭dp[i] 到达第i阶有多少种方案
* 2.dp递推关系式 dp[i] = dp[i - 1] + dp[i - 2]
* 3.dp数组初始化 dp[1] = 1 dp[0] = 1
* 4.遍历顺序 从前向后
*/
if(n == 0 || 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];
}
}
上面初始化的dp[0]可能有争议,那就直接不从他开始就可以了
class Solution {
public int climbStairs(int n) {
/**
* 1.dp数组及其下标含义 搭dp[i] 到达第i阶有多少种方案
* 2.dp递推关系式 dp[i] = dp[i - 1] + dp[i - 2]
* 3.dp数组初始化 dp[1] = 1 dp[2] = 2
* 4.遍历顺序 从前向后
*/
if(n == 1 || n == 2) return n;
int[] dp = new int[n + 1];
dp[2] = 2;
dp[1] = 1;
for(int i = 3; i <= n; i++){
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
}
746.使用最小花费爬楼梯
题目链接:746. 使用最小花费爬楼梯 - 力扣(LeetCode)
解题思路:
动态规划五部曲,初始化要有理有据不能瞎猜瞎定。
class Solution {
public int minCostClimbingStairs(int[] cost) {
/**
* 1.确认dp数组及其下标含义 dp[i] 到达第i个台阶的最低花费
* 2.确认dp数组的递推关系式 dp[i] = min(dp[i - 1] + cost[i - 1],dp[i - 2] + cost[i - 2])
* 3.初始化方法 dp[1] = 0 dp[0] = 0 因为可以直接从0和1台阶开始,所以不需要花费
* 4.循环顺序
*/
int[] dp = new int[cost.length + 1];
dp[0] = 0;
dp[1] = 0;
for(int i = 2; i < dp.length; i++){
dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
}
return dp[dp.length - 1];
}
}