Leetcode -- 爬楼梯(70)

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

思路:分为两种情况,最后一步爬1个台阶或者最后一步爬2个台阶,二者之和即为所有的可能的方法。首先想到了递归算法,很不幸的是当n=38时就已经超时了。另外两种方法,斐波拉契数列以及动态规划法。

思路一:动态规划法

初始化dp[0]=0,dp[1]=1.dp[n]=dp[n-1]+dp[n-2]

 1 class Solution:
 2     def climbStairs(self, n: int) -> int:
 3         if n == 1:
 4             return 1
 5         dp = [1,2]   #初始化
 6         for i in range(3,n+1):
 7             temp = dp[-1]+dp[-2]
 8             dp.append(temp)
 9             dp.pop(0)    #为了减少内存开销,使数组大小始终为2,故每次弹出栈顶元素
10         return dp[-1]

思路二:斐波拉契数列法。

  

 1 class Solution:
 2     def climbStairs(self, n: int) -> int:
 3         if n == 1 or n == 2:
 4             return n
 5         f_1 = 1
 6         f_2 = 2
 7         for i in range(3,n+1):
 8             f_n = f_1 + f_2
 9             f_1 = f_2
10             f_2 = f_n
11         return f_n
12
13 #公式法
14 class Solution:
15     def climbStairs(self, n: int) -> int:
16         sqrt5 = math.sqrt(5)
17         fib = math.pow((1+sqrt5)/2,n+1)-math.pow((1-sqrt5)/2,n+1)
18         return int(fib/sqrt5)

原文地址:https://www.cnblogs.com/shawn-young/p/12636600.html

时间: 2024-10-29 22:30:43

Leetcode -- 爬楼梯(70)的相关文章

水leetcode 爬楼梯

public class Solution { public int climbStairs(int n) { if(n==1) return 1; if(n==2) return 2; int pre=1; int cur=2; for(int i=3;i<=n;i++) { int tem=pre; pre=cur; cur=pre+tem; } return cur; // else return climbStairs(n-1)+climbStairs(n-2); }} 水leetcod

动态规划(斐波那契系列)---爬楼梯

动态规划 ??递归和动态规划都是将原问题拆成多个子问题然后求解,他们之间最本质的区别是,动态规划保留了子问题的解,避免了重复计算. 爬楼梯 70. Climbing Stairs (Easy) 题目描述: ??有 N 阶楼梯,每次可以上一阶或者两阶,求有多少种上楼梯的方法. 思路分析: ??定义一个dp数组存储上楼梯的方法数,dp[i]表示走到第i层楼的方法数,第i层楼梯可以从第i-1层和i-2个楼梯再走一步到达.那么走到第i层楼梯的方式为走到第i-1层的方式和第i-2层的方式和. dp[ i

[leetcode] 70. 爬楼梯

70. 爬楼梯 最简单的动态规划 假设f[i]表示爬到第i层有几种爬法 那么状态转移方程为:f[i] = f[i-1] + f[i-2] 初始条件显然是:f[1]=1,f[2] = 2; class Solution { public int climbStairs(int n) { if (n == 1) return 1; int f[] = new int[n]; f[0] = 1; f[1] = 2; for (int i = 2; i < n; i++) { f[i] = f[i -

#动态规划 LeetCode 70 爬楼梯

假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶. 1 阶 + 1 阶 2 阶 示例 2: 输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶. 1 阶 + 1 阶 + 1 阶 1 阶 + 2 阶 2 阶 + 1 阶 思路:关于动态规划的问题,一般选择先使用递归的思路切入问题.以本题为例: 递归的思路,我们要确定当前递归函数

leetcode 70. 爬楼梯(Climbing Stairs)

目录 题目描述: 示例 1: 示例 2: 解法: 题目描述: 假设你正在爬楼梯.需要 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 阶 解法: clas

LeetCode 70 - 爬楼梯 - [递推+滚动优化]

假设你正在爬楼梯.需要 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 阶 设 $f[n]$ 表示跳上 $n$ 级台阶的方案数目,因此很容易得到 $f[n] = f[n-1

LeetCode 题解 | 70. 爬楼梯

假设你正在爬楼梯.需要 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 阶 Code class Solution { public: int climb

力扣第70题:爬楼梯

力扣第70题:爬楼梯 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶. 1 阶 + 1 阶 2 阶 示例 2: 输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶. 1 阶 + 1 阶 + 1 阶 1 阶 + 2 阶 2 阶 + 1 阶 ? int climbStairs(int n) { if (n <= 1) { re

菜鸡学算法--70. 爬楼梯

先来看题目: 假设你正在爬楼梯.需要 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 阶 作为一个菜鸡,看到题目直接懵逼,思路混乱. 解题大招: 首先,计算可执行的逻辑最后