代码随想录二刷第十二天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯、343. 整数拆分

44 阅读2分钟

509. 斐波那契数

题目:509. 斐波那契数 - 力扣(LeetCode)

题解:代码随想录

状态:AC

思路

动态规划思路:

  1. 明确dp数组及下标i含义
  2. 确定递推公式:dp[i] = dp[i - 1] + dp[i - 2]
  3. 初始化dp数组
  4. 确定遍历顺序
  5. 举例推导dp数组

代码

时间复杂度:O(n) 空间复杂度:O(1)

class Solution {
    public int fib(int n) {
        if(n < 2) return n;
        int sum = 0;
        int left = 0, right = 1;
        for(int i = 2; i <= n; i++){
            sum = left + right;
            left = right;
            right = sum;
        }
        return sum;
    }
}

70. 爬楼梯

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

题解:代码随想录

状态:AC

思路

dp[i] = dp[i - 1] + dp[i - 2]

代码

时间复杂度:O(n) 空间复杂度:O(1)

class Solution {
    public int climbStairs(int n) {
        if(n <= 2) return n;
        int sum = 0;
        int left = 1, right = 2;
        for(int i = 3; i <= n; i++){
            sum = left + right;
            left = right;
            right = sum;
        }
        return sum;
    }
}

746. 使用最小花费爬楼梯

题目:746. 使用最小花费爬楼梯 - 力扣(LeetCode)

题解:代码随想录

状态:AC

思路

dp[i] = Math.min(cost[i - 2] + dp[i - 2], cost[i - 1] + dp[i - 1])

代码

时间复杂度:O(n) 空间复杂度:O(1)

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int left = 0, right = 0;
        int res = 0;
        for (int i = 2; i <= cost.length; i++) {
            int temp = Math.min(cost[i - 2] + left, cost[i - 1] + right);
            left = right;
            right = temp;
        }
        return right;
    }
}

343. 整数拆分

题目:343. 整数拆分 - 力扣(LeetCode)

题解:代码随想录

状态:需要多复习

思路

  • dp[i]表示数字i的拆分结果,注意j<=i-j避免重复计算,例如:1,3 和 3,1
  • j * (i - j) 是单纯的把整数拆分为两个数相乘,而j * dp[i - j]是拆分成两个以及两个以上的个数相乘
  • dp[i] = Math.max(dp[i], Math.max(j * dp[i - j], j * (i - j)))

代码

时间复杂度:O(n^2) 空间复杂度:O(N)

class Solution {
    public int integerBreak(int n) {
        int[] dp = new int[n + 1];
        dp[2] = 1;
        for(int i = 3; i <= n; i++){
            for(int j = 1; j <= i - j; j++){
                dp[i] = Math.max(dp[i], Math.max(j * dp[i - j], j * (i - j)));
            }
        }
        return dp[n];
    }
}