题目还是昨天的题,昨天已经介绍了三种解法了,今天介绍一个最快的方法。

题目链接

LeetCode 面试题 08.01. 三步问题[1]

题目描述

三步问题。有个小孩正在上楼梯,楼梯有 阶台阶,小孩一次可以上 阶、 阶或 阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模

示例1

        输入:
n = 3
输出:
4
解释:
有四种走法

示例2

        输入:
n = 5
输出:
13

题解

昨天的题解地址:
韦阳的博客:【每日算法Day 79】所有人都会做的入门题,但是能看出你的代码能力![2]

知乎专栏:【每日算法Day 79】所有人都会做的入门题,但是能看出你的代码能力![3]

昨天是通过动态规划来解决的,转移方程为:

初始情况是

如果通过递推的方式来求解的话,时间复杂度是 ,但是我们还可以用矩阵快速幂的方法加速到

相信大家快速幂一定听说过(没听说过当我没说),如果让你求 ,那么可以分两种情况。如果 是偶数,那么可以计算 ,然后求它的平方 就行了。如果 是奇数,那么可以计算 ,然后求它的平方 就行了。这样只需要用 的复杂度就可以计算出 了。

类似的,如果我们要计算一个矩阵的幂 ,也可以将其拆分成两半,然后计算一半再平方就行了。

那么这题跟矩阵有什么关系呢?如果我们把转移方程右边三项写成向量形式:

那么给它右边乘上一个矩阵

那么就会得到向量:

即:

所以乘一次矩阵 就可以得到下一个 值,那么从初始的向量 开始,乘上 就可以得到 了。

而这里的 就可以通过矩阵快速幂来计算得到。

代码

c++

        typedef long long ll;
typedef vector<vector<ll>> vvl;
typedef vector<ll> vl;
const ll p = 1e9+7;class Solution {public:vvl mat_mul(vvl& A, vvl& B) {int a = A.size(), b = B.size(), c = B[0].size();vvl C(a, vl(c, 0));for (int i = 0; i < a; ++i) {for (int j = 0; j < c; ++j) {for (int k = 0; k < b; ++k) {(C[i][j] += A[i][k] * B[k][j]) %= p;}}}return C;}vvl mat_pow(vvl& A, int n) {int m = A.size();vvl B(m, vl(m, 0));for (int i = 0; i < m; ++i) B[i][i] = 1;while (n > 0) {if (n&1) B = mat_mul(B, A);A = mat_mul(A, A);n >>= 1;}return B;}vvl mat_pow_rec(vvl& A, int n) {if (n == 1) return A;vvl B = mat_pow_rec(A, n/2);B = mat_mul(B, B);if (n&1) return mat_mul(A, B);return B;}int waysToStep(int n) {vl f = {1, 2, 4};if (n <= 3) return f[n-1];vvl A = {{0, 0, 1}, {1, 0, 1}, {0, 1, 1}};vvl B = mat_pow(A, n-3);ll res = 0;for (int i = 0; i < 3; ++i) {(res += f[i] * B[i][2]) %= p;}return res;}
};

python

        import numpy as npclass Solution:def mat_pow(self, A, n):m = A.shape[0]B = np.eye(m, dtype=np.int64)while n > 0:if (n&1)!=0:B = np.mod(np.matmul(B, A), self.p).astype(np.int64)A = np.mod(np.matmul(A, A), self.p).astype(np.int64)n >>= 1return B;def waysToStep(self, n: int) -> int:self.p = int(1e9+7)f = [1, 2, 4]if n <= 3: return f[n-1]A = np.array([[0, 0, 1], [1, 0, 1], [0, 1, 1]], dtype=np.int64)B = self.mat_pow(A, n-3)res = 0for i in range(3):res += f[i] * B[i][2]return int(res%self.p)

参考资料

[1]

LeetCode 面试题 08.01. 三步问题: https://leetcode-cn.com/problems/three-steps-problem-lcci/

[2]

韦阳的博客:【每日算法Day 79】所有人都会做的入门题,但是能看出你的代码能力!: https://godweiyang.com/2020/03/24/leetcode-inteview-08-01/

[3]

知乎专栏:【每日算法Day 79】所有人都会做的入门题,但是能看出你的代码能力!: https://zhuanlan.zhihu.com/p/115799226

【每日算法Day 80】所有人都会做的入门题,高级解法来了!相关推荐

  1. 反直觉的三门问题,80%的人都会错?

    导读:据说面对这个经典的条件概率问题,80%的人凭直觉做出了错误的选择,然而他们却坚信自己才是对的. 作者:徐晟 来源:大数据DT(ID:hzdashuju) 三门问题,又称蒙提霍尔问题,出自20世纪 ...

  2. 据说有99%的人都会做错的面试题

    这道题主要考察了面试者对浮点数存储格式的理解.另外,请不要讨论该题本身是否有意义之类的话题.本题只为了测试面试者相关的知识是否掌握,题目本身并没有实际的意义. 下面有6个浮点类型变量,其中前三个是fl ...

  3. Java 面试 80% 的人都会踩这些坑,你知道几种?

    很多朋友经常在留言区,跟我吐槽 Java 面试时遇到的问题(我选了几个经典的问题): Java 技术能力自以为还不错,但是到了面试的时候就凉凉: 对面试官提出的问题感觉很懵,不知道面试官要问啥: 有的 ...

  4. 宁夏大学计算机考研论坛,很多人认为宁夏大学考研题普通人都会做,不如一起来做下试试...

    刚在别人的帖子下边,有很多人题很简单,自己不是学中文的,名词解释都能答的差不多,还各种瞧不起答不上来的人.那不如都来试试看看都能完整答出来几道题.. 感觉能答上来的的确厉害,我是真的佩服的这个,但是我 ...

  5. 直播间越播越没人,大部分刚开始做直播电商的人都会这样

    直播间越播越没人,大部分刚开始做直播电商的人都会这样,看着其他同行的直播间做得不错就照葫芦画瓢,并不知道背后做了哪些工作? 开播前一定要准备直播脚本和产品过款话术,不要让直播在直播间随意发挥,团队也随 ...

  6. Meta 用算法“随机”解雇 60 人;印度的“网络霸凌”最严重;越南要求外国公司数据存储本地化| 每日大事件...

    数据智能产业创新服务媒体 --聚焦数智 · 改变商业 01.Meta 用算法"随机"解雇 60 人 8 月 20 日消息,Meta 最近使用算法"随机"解雇了 ...

  7. u盘提示格式化怎么修复?80%的人都在这么做!

    u盘是我们平时经常使用的一个存储设备,使用时间久了容易出现格式化的情况,而这种情况一般都会出现在 U盘上.如果出现格式化的提示,u盘提示格式化怎么修复?很多小伙伴们可能都不知道恢复的方法,今天我们就一 ...

  8. 自学算法的那么多人,凭什么他能去大厂和做算法带队人!

    今天要给大家推荐的是一个推荐系统领域的算法大牛:Thinkgamer.首先我们回答标题中的问题: 自学算法的那么多人,凭什么他能去大厂和做算法带队人! 他在校期间,自学了Hadoop,Spark和算法 ...

  9. 快手上市,投资人张斐说:多数人惊叹算法威力,少数人理解网络结构

    ■ 按: 快手今日上市,关于快手的分析市场有许多报道,今天看到捕手志(ID:ibushouzhi)与快手首轮投资人五源资本合伙人张斐的对话,极有价值.张斐也是脉脉.雪球.Pony.ai.商汤科技等公司 ...

  10. 输入一个数寻找丑数C语言,数据结构与算法试题80道.doc

    数据结构与算法试题80道 由于这些题,实在太火了.所以,应广大网友建议要求,在此把之前已整理公布的前80题, 现在,一次性分享出来.此也算是前80题第一次集体亮相. 此些题,已有上万人,看到或见识到, ...

最新文章

  1. Metasploit irb命令使用技巧
  2. toolkit,phonetextbox中实现用户按回车键会换行
  3. 在LINUX环境中,哪种文件系统存储更安全?
  4. linux不断安装操作系统,无人值守批量安装linux操作系统
  5. 25个创意的交互式图表设计欣赏
  6. c# 判断点是否在区域内 点在区域内 在多边形内 判断
  7. 设计模式行为模式_使用行为模式建立很棒的社区
  8. UI学习笔记---EasyUI panel插件使用---03
  9. 英语 没有听懂对方说什么 怎么说
  10. 如何完整离线保存网页,包括网页完整特效?
  11. [leetcode]187. Repeated DNA Sequences寻找DNA中重复出现的子串
  12. linux安装tftp服务器
  13. 多个图片合成PDF文件
  14. 表格table标签的属性及使用方式
  15. 标准证件照电子版怎么做?
  16. java 苹果vcf解析,VCF格式解析 | Public Library of Bioinformatics
  17. iOS系统访问权限大全
  18. 时间工具类: 判断两个时间是否是同一月、是否是同一天
  19. HBase是什么?为什么要使用HBase?
  20. SinoBBD承德德鸣3号楼数据中心获CQC最高等级机房认证

热门文章

  1. 团队计划(4.22)
  2. 《人人都是产品经理》读后小结
  3. Ubuntu下同时安装caffe和tensorflow
  4. macOS Sierra 10.12.6 odoo 10.0 开发环境配置
  5. https原理:证书传递、验证和数据加密、解密过程解析
  6. Struts(一)struts2.2概述与MVC模式深度剖析
  7. [PeterDLax著泛函分析习题参考解答]第4章 Hahn-Bananch 定理的应用
  8. 幽冥问答录:兼职阴间判官介绍阴间是什么样子
  9. 在windows server 2003服务器上提供NTP时间同步服务
  10. BZOJ 1597 [Usaco2008 Mar]土地购买 (斜率优化dp)