一、509. 斐波那契数
题目链接:https://leetcode.cn/problems/binary-search/description/
文章讲解:https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html
视频讲解:https://www.bilibili.com/video/BV1fA4y1o715
1.1 初见思路
- 动规五部曲
1.2 具体实现
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];
}
}
1.3 重难点
二、 70. 爬楼梯
题目链接:https://leetcode.cn/problems/climbing-stairs/
文章讲解:https://programmercarl.com/0070.%E7%88%AC%E6%A5%BC%E6%A2%AF.html
视频讲解:https://www.bilibili.com/video/BV17h411h7UH
2.1 初见思路
- 动规五部曲,一定要做这个步骤
- 确认dp[i]的含义:爬到第i层楼梯时有多少种方案
- 确定递归公式:dp[i] = dp[i - 1] + dp[i - 2]
- dp数组如何初始化: dp[1]=1,dp[2]=2 -->所以dp[0]=1
- 确定遍历顺序
- 举例推导dp数组
2.2 具体实现
class Solution {
public int climbStairs(int n) {
if(n==1){
return n;
}
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];
}
}
2.3 重难点
- 题目不难,但是要使用动规五部曲来分析,目的是掌握题目不难,但是要使用动规五部曲来分析,目的是掌握动规五部曲的分析过程
三、 746. 使用最小花费爬楼梯
题目链接:https://leetcode.cn/problems/min-cost-climbing-stairs/
文章讲解: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
视频讲解:https://www.bilibili.com/video/BV16G411c7yZ/
3.1 初见思路
- 怀疑是否存在情况,前面选择的局部最小会导致仍然要走一遍,反而花费更多,如[1,10,1,1,2,10,1,1]这种情况
- 使用动规五部曲来分析
- 确认dp[i]的含义:到达第i层楼梯花费的最少金额
- 确认递归公式:
1. 因为每次只能爬1~2个台阶,所以肯定是取 i-1 和 i-2 台阶的已花费金额加上当前台阶价格 的最小值
2. dp[i]=Min(dp[i-1]+cost[i-1] , dp[i-2]+cost[i-2]) - 确认初始值
1. dp[0]=cost[0],dp[1]=cost[1]------错误的!!
2. 本题应该是跳到第1和2台阶是没有花费的。 - 确认遍历顺序
- 模拟
3.2 具体实现
class Solution {
public int minCostClimbingStairs(int[] cost) {
int n=cost.length;
int[] dp = new int[n];
dp[0]=0;
dp[1]=0;
for(int i=2;i<n;i++){
dp[i]=Math.min(dp[i-1]+cost[i-1] , dp[i-2]+cost[i-2]);
}
return Math.min(dp[n-1]+cost[n-1], dp[n-2]+cost[n-2]);
}
}