LeetCode --- 爬楼梯

假设你正在爬楼梯。需要 n 步你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

示例 1:

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 步 + 1 步
2. 2 步

示例 2:

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 步 + 1 步 + 1 步
2. 1 步 + 2 步
3. 2 步 + 1 步

分析:

楼梯解法数目解法
011
111
2211,2
33111,21,12
451111,121,211,112,22
5811111,1112,1121,1211,2111,122,212,221

得出:f(n) = f(n-1) + f(n-2) (f(0)=1, f(1)=1)。

public class ClimbStairs {

    @Test
    public void climbStairs() {
        Assert.assertEquals(8, climbStairs(5));
        Assert.assertEquals(13, climbStairs(6));
    }

    public int climbStairs(int n) {
        if (n <= 1) return 1;
        int a1 = 1, a2 =1;
        for (int i = 2; i < n; i++) {
            if (a1 > a2) {
                a2 = a1 + a2;
            } else {
                a1 = a1 + a2;
            }
        }
        return a1 + a2;
    }

}
<think>好的,我现在需要帮助用户找到LeetCode上用C语言实现爬楼梯问题的解法。首先,我需要回忆一下这个问题的大致内容。题目是说,每次可以爬1或2个台阶,到达n阶楼梯有多少种不同的方法。这应该是一个动态规划或者斐波那契数列的问题。 根据用户提供的引用,特别是引用[3]和[4],问题确实与斐波那契数列相关。递归方法会导致重复计算,所以更优的解法是使用动态规划,避免子问题的重复计算。用户提到需要C语言的解法,但引用的例子中有Java代码,所以可能需要将Java的动态规划解法转换成C语言。 接下来,我需要确保动态规划的思路正确。例如,当n=1时,只有1种方法;n=2时,有两种方法。对于更大的n,每个dp[i]等于dp[i-1] + dp[i-2]。这和斐波那契数列的结构是一样的。 然后,我需要考虑C语言的实现方式。由于C语言没有内置的动态数组,可能需要使用固定大小的数组或者更优化的变量交换方法。比如,使用三个变量来保存前两个状态,从而节省空间复杂度到O(1)。不过用户可能需要一个基础的动态规划解法,所以先用数组实现。 在代码实现时,需要注意边界条件,比如n=0或n=1的情况。根据引用[4]中的Java代码,当n小于2时返回1。所以C语言中也需要处理这些情况。 然后,我应该检查是否有内存分配的问题。例如,当n较大时,使用数组可能会导致栈溢出,所以可能需要使用堆分配或者更优化的方法。不过对于LeetCode题目来说,通常给出的n不会太大,所以使用栈上的数组应该是可行的。 最后,需要测试几个例子来验证代码的正确性。比如n=3时应该有3种方法,n=4时应该有5种方法,是否符合斐波那契数列的规律。 另外,用户可能希望代码尽可能高效,所以可以考虑空间优化,比如只保存前两个值而不是整个数组。不过首先提供基础解法,再给出优化后的版本可能更全面。 总结步骤: 1. 确定动态规划的状态转移方程。 2. 处理边界条件(n=0,1,2)。 3. 将Java代码转换为C语言,注意数组的声明和使用。 4. 考虑空间优化,使用变量代替数组。 5. 编写示例代码并测试。</think>关于LeetCode爬楼梯问题(70. Climbing Stairs)的C语言解法,其核心思路是动态规划或斐波那契数列的优化实现。以下是具体实现步骤和代码示例: --- ### 问题分析 问题要求计算爬$n$阶楼梯的不同方式,每次可选择爬1或2阶。其递推公式为: $$f(n) = f(n-1) + f(n-2)$$ 边界条件为$f(1)=1$,$f(2)=2$[^3]。 --- ### C语言动态规划解法 使用动态规划避免递归的重复计算,时间复杂度$O(n)$,空间复杂度$O(n)$: ```c int climbStairs(int n) { if (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]; } ``` --- ### 空间优化解法 仅保留前两个值,空间复杂度降为$O(1)$: ```c int climbStairs(int n) { if (n <= 2) return n; int a = 1, b = 2, c; for (int i = 3; i <= n; i++) { c = a + b; a = b; b = c; } return b; } ``` --- ### 代码说明 1. **动态规划数组**:`dp[i]`表示爬$i$阶楼梯的方式数,递推公式直接对应斐波那契数列[^3]。 2. **边界处理**:当$n=1$或$n=2$时直接返回结果,避免数组越界。 3. **空间优化**:通过变量滚动更新,减少内存占用[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值