70. 爬楼梯

思路

动态规划

  • 第1级台阶:1种方法(爬1级);
  • 第2级台阶:2种方法(爬2个1级或1个2级);
  • 第N级台阶:从第n-1级台阶爬1级或从第n-2级台阶爬2级(由于限制只能爬1级或2级);
  • 所以第N级台阶的爬楼方案等于n-1级方案和n-2级方案之和,即f(n) = f(n-1) + f(n-2)。

推出动态方程公式后,很容易想到递归法,但是递归法,重复计算量大,运行时间超时。所以使用三个滑动块来做,方案更优。

// 递归
function helper($n){
    if($n == 1) return 1;
    if($n == 2) return 2;

    // 这次多次重复递归计算
    return $this->helper($n - 1) + $this->helper($n - 2);
}

这题也符合斐波那契数列。

复杂度

时间复杂度:O(n)

空间复杂度:O(1)

代码

php

class Solution {

    /**
     * @param Integer $n
     * @return Integer
     */
    function climbStairs($n) {
        $p1 = 0;
        $p2 = 0;
        $p3 = 1; // 第一个点 i = 1 的值
        for($i = 1; $i <= $n; $i++) {
            // 向前滑动
            $p1 = $p2;
            $p2 = $p3;
            // 计算新进入滑动区间的块
            $p3 = $p1 + $p2;
        }

        return $p3;
    }
}

golang

// dp方程:f(n) = f(n-1) + f(n-2)
func climbStairs(n int) int {
    p1 := 0
    p2 := 0
    p3 := 1
    for i := 1; i <= n; i++ {
        p1 = p2
        p2 = p3

        p3 = p1 + p2
    }

    return p3
}

results matching ""

    No results matching ""