数据结构刷题(二十八):509斐波那契数、70爬楼梯、746 使用最小花费爬楼梯

动态规划篇:

一、509. 斐波那契数

思路:动态规划五部曲。根据本题的要求具体划分:

  • 确定dp数组以及下标的含义:dp[i]的定义为:第i个数的斐波那契数值是dp[i]
  • 确定递推公式:状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];
  • dp数组如何初始化:dp[0] = 0, dp[1] = 1;
  • 确定遍历顺序: 从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的
  • 举例推导dp数组:

代码:

class Solution {
    public int fib(int n) {
        if (n <= 1) return n;
        // 这里设置为n+1,代表dp数组fib不记录前两个初始值
        int[] fib = new int[n + 1];
        fib[0] = 0;
        fib[1] = 1;
        for (int i = 2; i < fib.length; i++) {
            fib[i] = fib[i - 1] + fib[i - 2];
        }
        return fib[n];
    }
}

二、70. 爬楼梯

注意:这个题的初始化存在争议,这里是默认dp[1]=1作为开头,不考虑dp[0]的情况。

public int climbStairs(int n) {
            // 1.确定dp数组
            int[] dp = new int[n + 1];
            if (n <= 2) return n;
            // 2.初始化dp数组
            dp[1] = 1;
            dp[2] = 2;
            for (int i = 3; i < dp.length; i++) {
                // 3.4. 确定递推公式 和 确定遍历顺序
                dp[i] = dp[i - 1] + dp[i - 2];
            }
            return dp[n];
        }

三、746. 使用最小花费爬楼梯

注意:dp初始化 是dp[0] = 0,dp[1] = 0;

递推公式是dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);

代码:

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int n = cost.length;
        // dp[0] dp[1] 不算是楼梯里  所以索引是n + 1
        int[] dp = new int[n + 1];
        if (cost.length <= 1)
            return cost[0];
        if (cost.length <= 2)
            return Math.min(cost[0], cost[1]);
        dp[0] = 0;
        dp[1] = 0;
        for (int i = 2; i <= n; i++) {
            dp[i] = Math.min(cost[i - 1] + dp[i - 1], cost[i - 2] + dp[i - 2]);
        }
        return dp[n];
    }
}

你可能感兴趣的:(力扣刷题,数据结构,算法,动态规划)