111 · 爬楼梯Climbing Stairs

111 · 爬楼梯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?
样例
Example 1:

Input:

n = 3
Output:

3
Explanation:

1, 1, 1
1, 2
2, 1
total 3.

public class Solution {
    /**
     * @param n: An integer
     * @return: An integer
     */
    public int climbStairs(int n) {
        // write your code here
        if(n <= 1){
            return n ;
        }
        int last = 1 , lastlast = 1 ;
        int now = 0 ;
        for(int i = 2 ; i <= n ; i++ ){
            now = last + lastlast ;
            lastlast = last ;
            last = now ;
        }
        return now ;
    }
}
这是一个经典的递归问题,也可以通过动态规划来解决。我们可以把爬楼梯问题看作斐波那契数列的一个变种。 递归解法的思想是:爬到第n阶楼梯的方法数,等于爬到第n-1阶的方法数加上爬到第n-2阶的方法数。这是因为,要到达第n阶楼梯,你最后一步要么是从第n-1阶爬1步上来,要么是从第n-2阶爬2步上来。 递归解法代码如下: ```java public class ClimbingStairs { public int climbStairs(int n) { if (n <= 2) { return n; } return climbStairs(n - 2); } public static void main(String[] args) { ClimbingStairs solution = new ClimbingStairs(); int n = 2; System.out.println("Total ways to climb " + n + " steps: " + solution.climbStairs(n)); } } ``` 这段代码会递归地调用`climbStairs`方法,直到到达基本情况`n <= 2`。 然而,这种递归方法的时间复杂度较高,因为它包含大量的重复计算。为了优化这个问题,我们可以使用动态规划方法,通过保存已经计算过的中间结果来避免重复计算。 动态规划解法代码如下: ```java public class ClimbingStairs { public int climbStairs(int n) { if (n <= 2) { return n; } int[] dp = new int[n]; dp[0] = 1; // 第0阶有一种方法,就是不爬 dp[1] = 2; // 第1阶有两种方法,要么爬两步,要么不爬 for (int i = 2; i < n; i++) { dp[i] = dp[i - 1] + dp[i - 2]; } return dp[n - 1]; } public static void main(String[] args) { ClimbingStairs solution = new ClimbingStairs(); int n = 2; System.out.println("Total ways to climb " + n + " steps: " + solution.climbStairs(n)); } } ``` 在这个动态规划版本中,我们使用一个数组`dp`来保存到达每个阶梯的方法数,然后按照递推公式计算出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值