LeetCode——爬楼梯

tech2023-07-21  104

LeetCode——爬楼梯

题目描述: 假设你正在爬楼梯。需要 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 n2

LeetCode测试结果:

最新回复(0)