爬楼梯方法数 (leetcode 70)

一:解题思路

这道题目是一道简单的动态规划题目。

第一种方法为递归法。Time:O(2^n),Space:O(n)

第二种方法利用一个数组:Time:O(n),Space:O(n)

第三种方法为迭代法。Time:O(n),Space:O(1)

二:完整代码示例 (C、C++、Java、Python)

方法一C:

int climbStairs(int n) {
    if (n == 1) return 1;
    if (n == 2) return 2;

    return climbStairs(n - 1) + climbStairs(n-2);
}

方法二C:

int climbStairs(int n) {
    if (n == 1) return 1;
    if (n == 2) return 2;

    int i = 0;
    int* d = (int*)malloc(sizeof(int)*(n+1));
    d[0] = 1;
    d[1] = 1;
    for (i = 2; i <= n; i++) {
        d[i] = d[i - 1] + d[i-2];
    }

    return d[n];
}

方法三C:

int climbStairs(int n) {
    if (n == 0) return 1;
    if (n == 1) return 1;

    int i = 0;
    int first = 1;
    int second = 1;

    for (i = 2; i <= n; i++) {
        int cur = first + second;
        first = second;
        second = cur;
    }

    return second;
}

方法一C++:

class Solution {
public:
    int climbStairs(int n) {
        if (n == 0) return 1;
        if (n == 1) return 1;

        return climbStairs(n - 1) + climbStairs(n-2);
    }
};

方法二C++:

class Solution {
public:
    int climbStairs(int n) {
        if (n == 0) return 1;
        if (n == 1) return 1;

        vector<int> d(n+1,0);
        d[0] = 1;
        d[1] = 1;

        for (int i = 2; i <= n; i++) {
            d[i] = d[i - 1] + d[i-2];
        }

        return d[n];
    }
};

方法三C++:

class Solution {
public:
    int climbStairs(int n) {
        if (n == 0) return 1;
        if (n == 1) return 1;

        int first = 1;
        int second = 1;
        for (int i = 2; i <= n; i++) {
            int cur = first + second;
            first = second;
            second = cur;
        }

        return second;
    }
};

方法一Java:

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

方法二Java:

class Solution {
      public int climbStairs(int n) {
             if(n==0) return 1;
             if(n==1) return 1;
             
             int[] d=new int[n+1];
             d[0]=1;
             d[1]=1;
             
             for (int i=2;i<=n;i++){
               d[i]=d[i-1]+d[i-2];
             }
             
             return d[n];
      }
    }

方法三Java:

 

class Solution {
      public int climbStairs(int n) {
             if (n==0) return 1;
             if (n==1) return 1;
             
             int first=1;
             int second=1;
             
             for (int i=2;i<=n;i++){
               int cur=first+second;
               first=second;
               second=cur;
             }
             
             return second;
      }
    }

方法一Python:

class Solution:
    def climbStairs(self, n: int) -> int:
        if n==0 or n==1: return 1
        
        return self.climbStairs(n-1)+self.climbStairs(n-2)

方法二Python:

class Solution:
    def climbStairs(self, n: int) -> int:
        if n==0 or n==1: return 1
        d={}
        d[0]=1
        d[1]=1
        for i in range(2,n+1):
            d[i]=d[i-1]+d[i-2]
        return d[n]

方法三Python:

class Solution:
    def climbStairs(self, n: int) -> int:
        if n==0 or n==1: return 1
        first=1
        second=1
        for i in range(2,n+1):
            cur=first+second
            first=second
            second=cur
        return second
posted @ 2020-03-12 17:06  repinkply  阅读(292)  评论(0)    收藏  举报