70. 爬楼梯

本文介绍了一道经典的算法题目——爬楼梯的不同方法数,通过递归和动态规划的方式解析,并给出了LeetCode中的Java解决方案。重点讲解了如何用转移方程f(x)=f(x-1)+f(x-2)求解,适合初学者理解动态规划应用。
摘要由CSDN通过智能技术生成

难度: 简单
题目:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意: 给定 n 是一个正整数。

示例 1:

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

示例 2:

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

解题:
这个题在Leetcode上使用递归会超时。
从最后一层来考虑,到达顶层有两种方式,一是从前一层一步,二是从前两层一下跨两层到达。因此,总的方法数也就是f(x-1) + f(x-2)。

f(x)=f(x−1)+f(x−2)
从第 0 级开始爬的,所以从第 0 级爬到第 0 级我们可以看作只有一种方案,即 f(0) = 1;从第 0 级到第 1 级也只有一种方案,即爬一级,f(1)=1。这两个作为边界条件就可以继续向后推导出第 n 级的正确结果。我们不妨写几项来验证一下,根据转移方程得到 f(2)=2,f(3)=3,f(4)=5,……,我们把这些情况都枚举出来,发现计算的结果是正确的。 (从Leetcode官方解答复制的,感觉还是官方的解释最通俗)。
class Solution {
public:
    int climbStairs(int n) {
    	// iOneStep,是到达目标层数,需要跨一步的方法数即f(x-1)
    	// iTwoStep, 同上
        int iResult = 1, iOneStep = 0, iTwoStep = 0;
    	for (int i = 1; i <= n;++i)
    	{
    		// 需要跨两步的方法数也就是上一层计算后,需要跨一步的方法数量
        	iTwoStep = iOneStep;
        	// 需要跨一步的方法数也就是到达上一层的方法数
        	iOneStep = iResult;
        	iResult = iOneStep + iTwoStep;
    	}
    	return iResult;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值