LeetCode_Climbing_Stairs

LeetCode Climbing Stairs

问题描述:

问题摘自LeetCode官网,可以参见Climbing Stairs。

You are climbing a stair case. It takes n steps to reach to the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

Note: Given n will be a positive integer.

Example 1:

Input: 2
Output: 2
Explanation: There are two ways to climb to the top.
1. 1 step + 1 step
2. 2 steps

Example 2:

Input: 3
Output: 3
Explanation: There are three ways to climb to the top.
1. 1 step + 1 step + 1 step
2. 1 step + 2 steps
3. 2 steps + 1 ste

思路(Fibonacci Number):

现共有n层台阶,则到达第n层台阶有两种方式:

  1. 从第n-1层台阶走一步。

  2. 从第n-2层台阶走两步。

对一些信息进行符号表示:

  • 到达第n层的方法有dp[n]种。
  • 到达第n-1层的方法有dp[n-1]种。
  • 到达第n-2层的方法有dp[n-2]种。

由以上的信息可以得出的想法是:
d p [ n ] = d p [ n − 1 ] + d p [ n − 2 ] dp[n] = dp[n-1] + dp[n-2] dp[n]=dp[n1]+dp[n2]

设想:dp[n-1]和dp[n-2]中是否存在重叠。

试假设需从第i层分别走到第n-1层和第n-2层,方法分别为p1种和p2种。

则无论最后是走到第n-1层还是第n-2层,从第1层走到第i层的方式都为dp[i]种。

可以知道从第1层走到第n-1层和第n-2层的方法分别为:p1*dp[i],p2*dp[i]。

当然他们不一定会踏上第i层台阶,但可以知道的是dp[n-1]和dp[n-2]中不存在重叠的方法。

由此想法可以联系到Fibonacci Number。

Fibonacci Number的基本思想是:
f i b ( n ) = f i b ( n − 1 ) + f i b ( n − 2 ) fib(n) = fib(n-1) + fib(n-2) fib(n)=fib(n1)+fib(n2)

已知条件为:dp[1] = 1,dp[2] = 2

按照Fibonacci Number方式计算:

dp[3] = dp[2] + dp[1]
dp[4] = dp[3] + dp[2]
...
dp[n] = dp[n-1] + dp[n-2]

最后代码(JavaScript)如下:

var climbStairs = function(n) {
    let first = 1;
    let second = 2;
    let third;
    if (n === 1) return 1;
    for (let i = 3; i <= n; i++) {
        third = first + second;
        first = second;
        second = third;
    }
    return second;   
};

你可能感兴趣的:(算法)