代码随想录-2023/08/04

120 阅读1分钟

动态规划

1.509斐波那契数列

解题思路:

  1. 递归
  2. 动态规划

代码:

class Solution {
    public int fib(int n) {
        if(n < 2) return n;
        // 动态规划
        int[] arr = new int[n+1];
        arr[0] = 0; arr[1] = 1;
        for(int i=2; i<=n; i++) {
            arr[i] = arr[i-1] + arr[i-2];
        }

        return arr[n];

    }
}

70.爬楼梯

解题思路:

  1. 动态规划 每个台阶都能由前一步跨一步上来, 或者前两步跨一步上来, 那么上到当前位置的台阶不同方案就等于dp[n-1] + dp[n-2]

代码:

    class Solution {
        public int climbStairs(int n) {
            int[] arr = new int[n+1];
            arr[0] = 1; arr[1] = 1;
            for(int i=2; i<=n; i++) {
                arr[i] = arr[i-1] + arr[i-2];
            }

            return arr[n];
        }
    }

746.使用最小花费爬楼梯

解题思路:

  1. 主题本题站在台阶上并不花费当前台阶cost, 当你到达下一台阶时,才花费掉
  2. 所以dp数组初始化为dp[0] = 0, dp[1] = 0, 因为你可以从下标为0或者1的位置出发, 所以你站在这两个位置是不花费任何成本的
  3. 那么以后的成本就由你前一步上来或者前两步上来的最小花费

代码:

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int n = cost.length;
        int[] dp = new int[n+1];

        dp[0] = 0; dp[1] = 0;
        for(int i=2; i<n+1; i++) {
            dp[i] = Math.min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);
        }

        return dp[n];

    }
}