第一种解法:斐波那契数F(n)=F(n-1)+F(n-2)

时间复杂度O(n) 空间复杂度O(1)

LeetCode 70.爬楼梯

LeetCode 70.爬楼梯

LeetCode 70.爬楼梯

 

 

java写法

第一种:

 public int climbStairs(int n) {

        if (n <= 3){

            return n;

        }

        int f1 = 2, f2 = 3, f3 = 4;

        for (int i = 4; i < n + 1; ++i){

            f3 = f1 + f2;

            f1 = f2;

            f2 = f3;

        } 

        return f3;

    }

第二种(与第一种相比只是参数值不同)

public int climbStairs(int n) {

        if (n <= 2){

            return n;

        }

        int f1 = 1, f2 = 2, f3 = 3;

        for (int i = 3; i < n + 1; ++i){

            f3 = f1 + f2;

            f1 = f2;

            f2 = f3;

        } 

        return f3;

    }

C++解法

 int climbStairs(int n) {

        if (n <= 2) {

            return n;

        }

        int f1 = 1;

        int f2 = 2;

        int f3 = 3;

        for (int i = 3; i < n + 1; ++i){

            f3 = f1 + f2;

            f1 = f2;

            f2 = f3;

        }

        return f3;

    }

第二种解法:斐波那契数递归解法F(n)=F(n-1)+F(n-2)

时间复杂度O(2^n) 空间复杂度O(n)

 public int climbStairs(int n) {
        if (n == 1){
            return 1;
        }
        if (n == 2){
            return 2;
        }
        return climbStairs(n - 1) + climbStairs(n - 2);
    } 

第三种解法:动态规划

时间复杂度O(n) 空间复杂度O(1)

C++描述:

int climbStairs(int n) {

        int a = 1, b = 1;

        while (--n > 0){

             a = (b += a) - a;

        }

        return b;

    }

JAVA描述

public int climbStairs(int n) {

        int a = 1, b = 1;

        while (--n > 0){

            a = (b += a) - a;

        }

        return b;

    }

第四种解法:斐波那契公式

 public int climbStairs(int n) {

        double sqrt_5 = Math.sqrt(5);

        double fib_n = Math.pow((1 + sqrt_5) / 2, n + 1) - Math.pow((1 - sqrt_5) / 2,n + 1);

        return (int)(fib_n / sqrt_5);

    }

相关文章: