欢迎光临散文网 会员登陆 & 注册

leetcode70-爬楼梯

2023-05-30 22:22 作者:超级小猫迭代  | 我要投稿

题目描述

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

(详情请见leetcode70)

动态规划

一开始用递归写,然后超时了...

随后开了大小为n的数组,后来发现没有必要,只需要三个整型...

大致思路:

在第 n 级台阶上的人,一定是从第 n-1 或第 n-2 级台阶迈上来的

由此可以列出状态转移方程f(n)%3Df(n-1)%2Bf(n-2)

边界条件是,f(0)%3D1%2Cf(1)%3D1

空间复杂度爆表的写法(O(n))

推荐的写法是利用滚动数组思想

空间复杂度为O(1)的写法

接下来是从答案抄来的代码

复杂度分析

时间复杂度:循环执行 n 次,每次花费常数的时间代价,故渐进时间复杂度为 O(n)。

空间复杂度:这里只用了常数个变量作为辅助空间,故渐进空间复杂度为 O(1)。

矩阵快速幂

是的,这种题对于大神来讲,是用来秀肌肉的orzorzorz

官方给出的答案里说,随着n的增大,时间复杂度会以O(n)增长

所以我们试图把时间复杂度降至O(logn)

利用小学二年级知识——矩阵乘法,推导出下面神奇的递推式

%5Cbegin%7Bbmatrix%7D1%261%5C%5C1%260%5Cend%7Bbmatrix%7D%5Cbegin%7Bbmatrix%7Df(n)%5C%5Cf(n-1)%5Cend%7Bbmatrix%7D%3D%5Cbegin%7Bbmatrix%7Df(n)%2Bf(n-1)%5C%5Cf(n)%5Cend%7Bbmatrix%7D%3D%5Cbegin%7Bbmatrix%7Df(n%2B1)%5C%5Cf(n)%5Cend%7Bbmatrix%7D

然后:

%5Cbegin%7Bbmatrix%7Df(n%2B1)%5C%5Cf(n)%5Cend%7Bbmatrix%7D%3D%5Cbegin%7Bbmatrix%7D1%261%5C%5C1%260%5Cend%7Bbmatrix%7D%5En%5Cbegin%7Bbmatrix%7Df(1)%5C%5Cf(0)%5Cend%7Bbmatrix%7D

定义矩阵

M%3D%5Cbegin%7Bbmatrix%7D1%261%5C%5C1%260%5Cend%7Bbmatrix%7D

问题变成了求解矩阵M的n次方问题

普通求法时间复杂度为O(n),为了降低时间复杂度

使用魔法快速幂加速n次方的求解

(快速幂视频友情链接)

直接上代码...

纳尼(⊙o⊙)?这是什么......

好的......中间那个函数是取矩阵M的快速幂用的

相当于把n二进制形式有1的位数取出,通过M不断做2次方次方(?)

求解出最终的M的n次方

具体可以看上面那个视频

那么,神魔情况下会用快速幂呢?

偷懒了,截个图(其实是图书馆闭馆力)

需要用到高等数学微分方程和线性代数的知识!orz

复杂度分析

时间复杂度:同快速幂,O(logn)

空间复杂度:O(1)

通项公式

不知道大佬们有没有看出来,这个递推式恰好是斐波那契数列

所以我们可以站在巨人的肩膀上

直接用公式求第n项!

(推导过程需要用到线性代数知识!可以前往leetcode70答案区看视频,一时半会我也说不清楚orz)

公式:f(n)%3D%5Cfrac%7B1%7D%7B%5Csqrt%7B5%7D%20%7D%20%5B(%5Cfrac%7B1%2B%5Csqrt%7B5%7D%7D%7B2%7D%20)%5En-(%5Cfrac%7B1-%5Csqrt%7B5%7D%7D%7B2%7D%20)%5En%20%5D

代码

打表法

找个层数在50左右的楼,走一走,数一数,既锻炼了身体,也增强了脑力!

写在最后

只有不停奔跑,才能勉强停在原地!

leetcode70-爬楼梯的评论 (共 条)

分享到微博请遵守国家法律