leetcode-zgd-day38-509.斐波那契数列/70.爬楼梯/746.使用最小花费爬楼梯

96 阅读2分钟

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.爬楼梯

题目链接:70. 爬楼梯 - 力扣(LeetCode)

解题思路:

还是动态规划那五部曲,唯一需要注意的就是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];
     }
 }