LeetCode 509 斐波那契数
题目链接:509. 斐波那契数 - 力扣(LeetCode)
【解题思路】
-
1.确定dp数组以及下标的含义
-
dp[i]的定义为:第i个数的斐波那契数值是dp[i]
-
-
2.确定递推公式
-
递推公式就是题目说的斐波那契值递推公式
-
-
3.确定dp数组如何初始化
-
题目也已经告诉我们了dp[0]和dp[1]的值
-
-
4.确定遍历顺序
-
因为我们需要按照递推公式:由前两个值推导第三个值,所以只能从前往后遍历
-
-
5.举例推导dp数组
-
按照题目要求手动推一遍斐波那契数值,再将我们代码输出的dp数组打印出来对照纠错。
-
【解题步骤】
-
1.如果n<=1,直接return n
-
2.创建一个int数组dp,长度为n+1用来存放斐波那契数
-
3.按照题目给的数值,初始化dp[0]和dp[1]
-
4.从i=2开始逐步往后推,直到i<=n:
-
按照递推公式给当前位置的dp数组赋值
-
-
5.返回dp数组第n个位置元素
【代码部分】
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];}
}
LeetCode 70 爬楼梯
题目链接:70. 爬楼梯 - 力扣(LeetCode)
【解题思路】
-
1.确定dp数组以及下标的含义
-
dp[i]的定义是:爬到第i层楼梯,由dp[i]种方法
-
-
2.确定递推公式
-
因为题目说了只能一次走一步或者走两步,因此当前楼梯就有“前两层楼梯的方法之和”种方法前进,也就是:
-
dp[i] = dp[i-1]+dp[i-2](斐波那契数)
-
-
-
3.确定dp数组如何初始化
-
因为dp[0]无论是等于0还是等于1都能说通,为了避免争议,我们初始化dp[1]=1,dp[2]=2
-
-
4.确定遍历顺序
-
因为我们必须根据前两层的前进方法推出当前层的前进方法,所以只能从前向后遍历
-
-
5.举例推导dp数组
-
按照题目要求手动推一遍结果,再将我们代码输出的dp数组打印出来对照纠错。
-
【解题步骤】
-
1.如果n<= 2,直接return n
-
2.创建一个int数组dp,长度为n+1用来存放斐波那契数
-
3.按照题目给的数值,初始化dp[1]=1,dp[2]=2
-
4.从i=3开始逐步往后推,直到i<=n:
-
按照递推公式给当前位置的dp数组赋值
-
-
5.返回dp数组第n个位置元素
【代码部分】
public int climbStairs(int 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];
}
LeetCode 746 使用最小花费爬楼梯
题目链接:746. 使用最小花费爬楼梯 - 力扣(LeetCode)
【解题思路】
-
1.确定dp数组以及下标的含义
-
dp[i]的定义为:到达第i层所花费的最少体力为dp[i]
-
-
2.确定递推公式
-
dp[i] = min(dp[i1]+cost[i-1]+dp[i-2]+cost[i-2])
-
-
3.确定dp数组如何初始化
-
dp[0]=0,dp[1]=1
-
-
4.确定遍历顺序
-
因为我们需要按照递推公式:由前两个值推导第三个值,所以只能从前往后遍历
-
-
5.举例推导dp数组
-
手动推导一下答案,然后将数组打印出来,对照着看看是否出错,在哪里出的错
-
【解题步骤】
-
1.定义一个len变量,记录传入的cost数组长度
-
2.定义一个dp数组,长度为len+1,记录我们的台阶层数
-
3.初始化dp[0]=0;dp[1] = 1
-
4.从i=2开始遍历整个cost数组长度:
-
当前层的花费为前两层的前进方法加上花费的最小值
-
-
5.返回dp数组最后位置的元素(跳到楼顶所花费的最少体力)
【代码部分】
class Solution {public int minCostClimbingStairs(int[] cost) {int len = cost.length;int[] dp = new int[len + 1];// 从下标为 0 或下标为 1 的台阶开始,因此支付费用为0dp[0] = 0;dp[1] = 0;// 计算到达每一层台阶的最小费用for (int i = 2; i <= len; i++) {dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);}return dp[len];}
}