70. 爬楼梯

122 阅读1分钟

思路:动态规划解决

  • dp[i]表示爬n个台阶的方法。
  • 状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶不就是dp[i]了么。还有就是dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法,那么再一步跳两个台阶不就是dp[i]了么。(其实这是个斐波那契数列)
  • 初始化dp[]

未优化的代码:时间复杂度O(N) 空间复杂度O(N)

//时间复杂度O(N) 空间复杂度O(N)
class Solution {
    public int climbStairs(int n) {
        if (n <= 1) {//特殊情况处理
            return 1;
        }
        int dp[] = new int[n + 1];
        dp[1] = 1;
        dp[2] = 2;
        for (int i = 3; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];//状态转移方程
        }
        return dp[n];

    }
}

上面的代码中,其实只用到了dp[i], dp[i-1], dp[i-2]这三个变量,没必要声明一个数组,用三个变量就行了。

优化后的代码:时间复杂度O(N) 空间复杂度O(1)

//时间复杂度O(N) 空间复杂度O(1)
class Solution {
    public int climbStairs(int n) {
        if (n <= 1) {//特殊情况处理
            return 1;
        }
        int p = 1;
        int q = 2;
        for (int i = 3; i <= n; i++) {
            int r = p + q;
            p = q;
            q = r;
        }
        return q;

    }
}