Leetcode No.70 爬楼梯问题

这篇总结一下Leetcode70题的爬楼梯、跳台阶问题,可以用动态规划或者Fibonacci数列解决。

题目大意

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例1

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。

  1. 1 阶 + 1 阶
  2. 2 阶

示例2

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。

  1. 1 阶 + 1 阶 + 1 阶
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶

解法一

打表法,将所有的结果存储在一个数组中,然后查表返回结果。

public void form() {
        res[0]=0;res[1]=1;res[2]=2;
        for(int i=3;i<100;i++)
            res[i]=res[i-1]+res[i-2];
    }
public int climbStairs(int n) {
        form();
        return res[n];
    }

运行时间1ms。

解法二

迭代法,类似于Fibonacci,f(n) = f(n-1) + f(n-2)。

public static int climbStairs(int n) {
        int a[]={1,2};
        if(n<3) return n;
        int sum = 0;
        for(int i=3;i<=n;i++)
        {
            sum = a[0]+a[1];
            a[0]=a[1];
            a[1]=sum;
        }
        return sum;
    }

运行时间1ms。

解法三

Fibonacci的数学公式。


image.png
public int climbStairs(int n) {
       double sqrt5 = Math.sqrt(5);
       double fib = Math.pow((1+sqrt5)/2,n+1)-Math.pow((1-sqrt5)/2,n+1);
       return (int)(fib/sqrt5);
    }

运行时间1ms。

你可能感兴趣的:(Leetcode No.70 爬楼梯问题)