题目描述: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶。
1 阶 + 1 阶2 阶 示例 2:输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶。
1 阶 + 1 阶 + 1 阶1 阶 + 2 阶2 阶 + 1 阶来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/climbing-stairs 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路: 动态规划:我们用f(x)来表示爬到x阶台阶的方案数。最后一步可能是两个台阶也有可能是一个台阶,爬到x阶台阶的方案数等于爬到x - 1的方案数和爬到x - 2的方案数之和。举个例子:要爬到5阶台阶,我们最后一步可能是1个台阶或2个台阶,当最后一步是1个台阶的时候,此时方案数就等于爬到第4阶台阶的方案数;当最后一步是2个台阶的时候,此时方案数就等于爬到第3阶台阶的方案数,因此f(5) = f(4) + f(3)。 由此可得出递推公式:f(x) = f(x - 1) + f(x - 2)。 我们可以惊喜得发现这是一个斐波那契数列。 我们可以用滚动数组的方式来减小空间复杂度,令n1 = 1,n2 = 2,用temp存储n1 + n2的值,然后令n1 = n2,n2 = temp,达到更新的作用,循环结束返回n2即可。 这里提供Java和Python的代码:
Java代码:
class Solution { public int climbStairs(int n) { if(n == 1){ return n; } int n1 = 1; int n2 = 2; for(int i = 3; i <= n; i++){ int temp = n1 + n2; n1 = n2; n2 = temp; } return n2; } }LeetCode测试结果: Python代码:
class Solution(object): def climbStairs(self, n): """ :type n: int :rtype: int """ if n == 1: return n n1 = 1 n2 = 2 for i in range(3, n + 1): temp = n1 + n2 n1 = n2 n2 = temp return n2LeetCode测试结果: