LeetCode-70. 爬楼梯 C/C++实现 超详细思路及过程[E]

本文介绍了如何通过动态规划解决爬楼梯问题,涉及状态转移方程、初始状态的设定,以及C/C++代码实现。还提到两种方法:C语言的数组实现和递归方法,以及优化空间复杂度的滚动数组技巧。

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

在这里插入图片描述

题目描述

70. 爬楼梯
难度:简单
相关标签:记忆化搜索、数学、动态规划

提示
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

运行示例
示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
方法1:1 阶 + 1 阶
方法2:2 阶
示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
方法1:1 阶 + 1 阶 + 1 阶
方法2:1 阶 + 2 阶
方法3:2 阶 + 1 阶

提示
1 <= n <= 45

题目分析与实现

这道题可以通过数学计算的方式得到,但博主我数学不及格,就不在这分析什么数学方法了。那还有什么方法可以解决这道题呢?感觉又是一道线性dp问题(线性动态规划问题)。为什么这么说呢?因为当n=3时,此时的爬楼梯的方法数决定于n=2和n=1的方法数。出现后一项依赖于前几项的情况时,这就很可能是一道动态规划问题。

如果是一道动态规划问题,我们就能列出状态转移方程(听起来很高大上,其实跟数学里的递推公式或者找规律时使用的公式很类似)并确定初始状态

首先列出初始状态,这里的初始状态就是n=1和n=2的情况,为什么是这两种情况??因为后续要计算n=3,n=4…时,必须要先知道n=1和n=2的情况。由题目分析可知,n=1时,爬楼梯方法只有1种(跨一个台阶就到楼顶了);n=2时,爬楼梯的方法数有2种,即跨2阶到楼顶或者跨1阶再跨1阶到楼顶。

下面我们就可以开始列状态转移方程了!我们知道,到n的方法有两种情况,一种是从n-1个台阶跨1阶到达的,一种是从n-2个台阶跨2阶到达的。也就是Fn=Fn-1+Fn-2
在这里插入图片描述
下面开始实现我们的代码:
C语言

int climbStairs(int n){
	//当n=1时,如果执行dp[1]=2的语句会报错(数组下标越界)
    if(n == 1)
        return 1;
    int* dp = (int*)malloc(sizeof(int) * n);
    //初始状态
    dp[0] = 1;
    dp[1] = 2;
    for(int i = 2; i < n; i++)
    	//状态转移方程
        dp[i] = dp[i - 1] + dp[i - 2];
    return dp[n - 1];
}

C++

class Solution {
public:
    int climbStairs(int n) {
    	//当n=1时,如果执行dp[1]=2的语句会报错(数组下标越界)
        if(n == 1)
            return 1;
        vector<int>dp(n);
        //初始状态
        dp[0] = 1;
        dp[1] = 2;
        for(int i = 2; i < n; i++)
        	//状态转移方程
            dp[i] = dp[i-1] + dp[i-2];
        return dp[n-1];
    }
};

这个算法时间复杂度为O(n),空间复杂度为O(1)。我们可以使用滚动数组的方式优化空间复杂度,可以参考之间文章746. 使用最小花费爬楼梯

还有个可以实现上述算法的方式递归法。但是这个方法在n过大的时候会超时,我们大概看看递归法的实现就可以了,这里不详细描述。
C语言

int climbStairs(int n){
    if(n == 1)
        return 1;
    else if(n == 2)
        return 2;
    else
        return climbStairs(n - 1) + climbStairs(n - 2);
}

C++

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

上面就是今天分享的所有内容啦!下一文章见!在这里插入图片描述
🎇有更优秀的算法,欢迎在评论区讨论!!

<think>好的,我需要处理用户关于华为OD题库A卷的查询。首先,用户之前已经询问过相关内容,现在想进一步了解具体的试题内容或答案解析。根据用户提供的引用资料,特别是引用[2]提到A卷是基础题库,包含数据结构、算法和编程基础题,而E卷则包含A+B+C+D的旧题加新题。引用[4]提到三道题难度在力扣的easy到middle级别,可能涉及字符串处理、数组操作和简单动态规划。 接下来,我需要整理用户可能需要的具体例子。比如,字符串处理题可以参考力扣的题目,如反转字符串中的单词。数组操作可能涉及两数之和或三数之和的变种。动态规划方面,爬楼梯问题是一个常见例子。同时,需要确保回答结构清晰,分点说明,并提供示例代码,如Python实现。 另外,用户要求生成相关问题,所以需要根据内容提出几个相关问题,比如如何准备A卷、典型题目类型以及动态规划题目的解题思路。同时,注意引用标记的正确使用,确保每个引用都对应正确的来源。 最后,检查是否符合系统级指令:使用正确的中文,LaTeX格式无误,行内公式用$...$,独立公式用$$...$$,并且没有使用任何Markdown格式。确保回答真实可靠,并参考了提供的引用内容。</think>### 华为OD题库A卷试题内容与答案解析 根据已有信息,华为OD机考A卷是基础题库,主要考察**数据结构、算法基础、字符串处理、数组操作**等编程能力[^2][^4]。以下结合引用内容整理典型题型与解析思路--- ### 一、典型题型与示例 #### 1. 字符串处理题 **题目示例**: 输入一个字符串,按单词顺序反转输出(保留空格),例如输入"hello world",输出"world hello"。 **解析思路**: - 使用字符串分割提取单词 - 逆序重组单词并拼接 **Python示例**: ```python def reverse_words(s): words = s.split() return ' '.join(reversed(words)) ``` #### 2. 数组操作题 **题目示例**: 给定整数数组和一个目标值,找出数组中两数之和等于目标值的索引(假设唯一解)。 **解析思路**: - 哈希表存储已遍历元素的值与索引 - 时间复杂度$O(n)$,空间复杂度$O(n)$ **Python示例**: ```python def two_sum(nums, target): hash_map = {} for i, num in enumerate(nums): complement = target - num if complement in hash_map: return [hash_map[complement], i] hash_map[num] = i return [] ``` #### 3. 动态规划基础题 **题目示例**: 爬楼梯问题:每次可爬1或2阶,求到达第$n$阶的方法数。 **解析思路**: - 状态定义:$dp[i]$表示到达第$i$阶的方案数 - 递推公式:$dp[i] = dp[i-1] + dp[i-2}$ **Python示例**: ```python def climb_stairs(n): if n <= 2: return n dp = [0] * (n+1) dp[1], dp[2] = 1, 2 for i in range(3, n+1): dp[i] = dp[i-1] + dp[i-2] return dp[n] ``` --- ### 二、A卷特点与备考建议 1. **难度范围**:题目难度集中在力扣**Easy到Middle**级别[^4]。 2. **高频考点**: - 字符串操作(反转、分割、匹配) - 数组遍历与双指针技巧 - 简单动态规划(斐波那契类问题) 3. **注意事项**: - 熟悉在线编程环境,避免因调试不熟练超时[^4] - 优先考虑时间复杂度优化,例如用哈希表替代暴力遍历 --- ### 三、答案解析资源推荐 1. **CSDN题库链接**: - [C++题库](https://blog.csdn.net/...) - [Python题库](https://blog.csdn.net/...) (部分题目附带解析,但需注意验证答案正确性)[^1][^3] 2. **力扣同类题**: - 字符串处理:[151. 反转字符串中的单词](https://leetcode.cn/problems/reverse-words-in-a-string/) - 数组操作:[1. 两数之和](https://leetcode.cn/problems/two-sum/) ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值