爬楼梯

假设你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部?
样例

比如n=3,1+1+1=1+2=2+1=3,共有3种不同的方法

返回 3

这道题实际上有些迷惑人    
仔细分析如果线条一节就会剩下 f(n-1)种答案    
而先跳两节则有 f(n-2)个    
总共为发f(n) = f( n  - 1) + f(n - 2)即斐波那契

class Solution:
    def climbStairs(self, n):
        if n == 1:
            return 1
        if n == 0:
            return 0
        myl = [1,1]
        for i in range(n -1 ):
            x = myl[-1] + myl[-2]
            myl.append(x)
        return myl[-1]

### C语言实现爬楼梯问题的解决方案 #### 方法一:递归方法 递归是一种直观的方式解决爬楼梯问题。以下是基于引用中的递归思想[^2]实现的一个简单例子: ```c int climbStairs(int n) { if (n == 1) { return 1; } else if (n == 2) { return 2; } else if (n > 2) { return climbStairs(n - 1) + climbStairs(n - 2); } } ``` 这种方法虽然易于理解,但在处理较大的输入时会非常低效,因为存在大量的重复计算。 --- #### 方法二:动态规划(数组存储) 为了优化递归方法的时间复杂度,可以采用动态规划的思想[^3]。通过使用一个数组来保存中间状态的结果,避免重复计算。 下面是具体的代码示例: ```c #include <stdio.h> int climbStairsDP(int n) { if (n <= 0) return 0; if (n == 1 || n == 2) return n; int dp[n + 1]; dp[1] = 1; dp[2] = 2; for (int i = 3; i <= n; ++i) { dp[i] = dp[i - 1] + dp[i - 2]; } return dp[n]; } int main() { int steps = 5; printf("Number of ways to climb %d stairs: %d\n", steps, climbStairsDP(steps)); return 0; } ``` 上述代码中,`dp[i]` 表示到达第 `i` 阶楼梯的不同方式数量。最终返回的是 `dp[n]` 的值。 --- #### 方法三:空间优化的动态规划 如果只关心最后的结果而不需要整个数组的状态,则可以通过两个变量代替完整的数组,进一步减少内存消耗[^1]。 下面是一个更高效的版本: ```c #include <stdio.h> int climbStairsOptimized(int n) { if (n <= 0) return 0; if (n == 1 || n == 2) return n; int a = 1, b = 2, temp; for (int i = 3; i <= n; ++i) { temp = a + b; a = b; b = temp; } return b; } int main() { int steps = 5; printf("Number of ways to climb %d stairs: %d\n", steps, climbStairsOptimized(steps)); return 0; } ``` 此方法仅需常数级别的额外空间即可完成计算。 --- #### 总结 以上三种方法分别展示了如何利用 **递归** 和 **动态规划** 来解决问题。其中,递归方法适合初学者理解和学习逻辑结构,但实际应用中应优先考虑动态规划及其优化形式以提升性能和降低资源开销。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值