• 2.17
    • 秒了
class Solution {
    public int climbStairs(int n) {
        int[] dp = new int[n];
        dp[0]=1;
        if(n==1) return 1;
        dp[1]=2;
        for(int i=2;i<n;i++){
            dp[i] = dp[i-2]+dp[i-1];
        }
        return dp[n-1];
    }
}
  • 2.4
    • 处理 n= =1 的情况,因为要向前初始化一步
    • 第二次我写的是逻辑后退一步的,第一个版本是符合直觉版本的,忽略 n=0 的情况,因为题目写了不为 0
class Solution {
    public int climbStairs(int n) {
        if(n==1) return 1;
        int[] dp = new int[n];
        dp[0] = 1;
        dp[1] = 2;
 
        for(int i=2;i<n;i++){
            dp[i] = dp[i-1]+dp[i-2];
        }
        return dp[n-1];
    }
}
  • 12.1
    • 处理边界

状态转移公式就是 “当前状态” 是如何由 “之前状态” 推导出来的数学(或逻辑)关系。 $f(n) = f(n-1) + f(n-2)$

class Solution {
    public int climbStairs(int n) {
        if(n<=2) return n;
        int[] dp = new int[n+1];
        dp[1] = 1;
        dp[2] = 2;
        for(int i = 3; i<n+1;i++){
            dp[i] = dp[i-1]+dp[i-2];
        }
        return dp[n];
    }
}