Leetcode 题目070-爬楼梯
LeetCode 题目 爬楼梯
2023-06-13 09:13:08 时间
我们用 f(n) 表示爬到第 n 级台阶的方案数,考虑最后一步可能跨了一级台阶,也可能跨了两级台阶,所以我们可以列出如下递归公式:
f(n) = f(n−1)+f(n−2)
并且 显然有
f(1) = 1,
f(2) = 2。
(还可以反推 f(0) = f(2) -f(1) =1, 完全契合 斐波那契数列)
- 最容易想到的的算法是递归, 缺点是效率低
class Solution:
def climbStairs(self, n: int) -> int:
if n == 1: return 1
if n == 2: return 2
return self.climbStairs(n-1) + self.climbStairs(n-2)
提交后显示 计算 f(40) 超时, 果然效率低。
- 这个递归很容易改造成循环
class Solution:
def climbStairs(self, n: int) -> int:
a, b = 1, 1 # for n==0 and n==1
for i in range(1, n):
a, b = b, a+b # python 语法糖, 不用临时变量
return b
- 我们还可以直接求出通项公式
根据递归公式有
上式可以用写成矩阵乘法的形式:
记
,
则有
显然求 f(n) 问题转换为求
的 第二行的元素之和。
import numpy as np
class Solution:
def climbStairs(self, n: int) -> int:
# 这里偷懒借助numpy
A = np.matrix([[1,1], [1,0]], dtype=int)
B = A ** n
return int(np.sum(B[1]))
- 还可以由线性代数中 矩阵对角化的相关知识 简化
的计算
矩阵的对角化
由
解出两个特征值:
没有重根。
之后直接根据通项公式求解。
from math import sqrt
class Solution:
def climbStairs(self, n: int) -> int:
sqrt5 = sqrt(5)
res = ((1+sqrt5)/2.0)**(n+1) - ((1-sqrt5)/2.0)**(n+1)
res = res/ sqrt5
return int(res)
相关文章
- LeetCode每日一题-4:合并两个有序链表
- ☆打卡算法☆LeetCode 216. 组合总和 III 算法解析
- 【LeetCode】均等概率问题,我有妙招!
- Leetcode 题目927-三等分0和1组成的数组
- Leetcode 题目870-优势洗牌(田忌赛马)
- Leetcode 题目 014. 最长公共前缀
- Leetcode题目 039. 组合总和
- Leetcode题目048-旋转图像
- leetcode刷题(132)——完全背包问题思路理解
- LeetCode(Weekly Contest 184)题解
- LeetCode(Weekly Contest 188)题解
- LeetCode 680. 验证回文字符串 Ⅱ
- leetcode二叉树的层次遍历_完全二叉树的中序序列
- JavaScript刷LeetCode拿offer-栈相关题目
- leetcode 234. 回文链表 js 实现
- leetcode 35. 搜索插入位置 js 实现
- leetcode刷题(126)——1289. 下降路径最小和 II
- Leetcode题目036. 有效的数独
- JavaScript刷LeetCode贪心算法篇
- LeetCode - #63 不同路径 II
- LeetCode - #71 简化路径
- 用javascript分类刷leetcode-排序算法(图文视频讲解)
- LeetCode-206-反转链表
- 每日一道leetcode:7. 整数反转