LeetCode 刷题记录 70. Climbing Stairs

本文详细解析了经典的爬楼梯问题,通过递归加记忆数组和动态规划两种方法求解到达楼顶的不同路径数量。使用C++、Java和Python三种语言实现,适合初学者理解和掌握斐波那契数列的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:
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 step
    解法1:递归加记忆数组
    本质上是斐波那契数列问题,爬到第n层,要么从n-1层一层上来,要么从n-2层爬两层上来
    得递推公式:dp[n] = dp[n-1] + dp[n-2]
    初始值,n=1为1,n=2为2
    直接用递归做,会超时,我们用一个数组记录下结果,避免不必要的计算
    c++:
class Solution {
public:
    int climbStairs(int n) {
        f = vector<int>(n+1,0);
        if(n == 1) return 1;
        f[1] = 1;
        f[2] = 2;
        return dfs(n);
    }
private:
    vector<int> f;
    int dfs(int n){
        
        if(n == 1) return f[1];
        if(n == 2) return f[2];
        if(f[n] > 0) return f[n];
        else return f[n] = dfs(n-1) + dfs(n-2);
    }

};

java:

class Solution {
    private int[] f = null;
    public int climbStairs(int n) {
        f = new int[n+1];
        if(n == 1) return 1;
        f[1] = 1;
        f[2] = 2;
        return dfs(n);
    }
    private int dfs(int n){
        if(n == 1) return f[1];
        if(n == 2) return f[2];
        if(f[n] > 0) return f[n];
        else return f[n] = dfs(n-1) + dfs(n-2);
    }
    
}

python:

class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        self.f = [0 for i in xrange(n+1)]
        if n == 1: return 1
        self.f[1] = 1
        self.f[2] = 2
        return self.dfs(n)
    def dfs(self, n):
        if n == 1: return self.f[1]
        if n == 2: return self.f[2]
        if self.f[n] > 0: return self.f[n]
        else:  
            self.f[n] = self.dfs(n-1) + self.dfs(n-2)
            return self.f[n]
        
       

解法2:
动态规划
c++:

class Solution {
public:
    int climbStairs(int n) {
        vector<int> f(n+1,0);
        if(n == 1) return 1;
        f[1] = 1;
        f[2] = 2;
        for(int i=3; i<=n;i++){
            f[i] = f[i-1] + f[i-2];
        }
        return f[n];
    }

};

java:

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

python:

class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        f = [0 for i in xrange(n+1)]
        if n == 1: return 1
        f[1] = 1
        f[2] = 2
        for i in xrange(3,n+1):
            f[i] = f[i-1] + f[i-2];
        
        return f[n]
        
        
    
        
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值