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

简介: LeetCode 面试题 08.01. 三步问题

题目链接


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

题目描述



image.png

示例1

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

示例2

输入:n = 5输出:13

题解


昨天的题解地址:

【每日算法Day 79】所有人都会做的入门题,但是能看出你的代码能力!

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

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


image.png


image.png

代码

c++

typedeflonglongll;typedefvector<vector<ll>>vvl;typedefvector<ll>vl;constllp=1e9+7;
classSolution {
public:  
vvlmat_mul(vvl&A, vvl&B) {  
inta=A.size(), b=B.size(), c=B[0].size();     
vvlC(a, vl(c, 0));    
for (inti=0; i<a; ++i) {     
for (intj=0; j<c; ++j) {   
for (intk=0; k<b; ++k) {    
                    (C[i][j] +=A[i][k] *B[k][j]) %=p;    
                }       
            }    
        }   
returnC;  
    }
vvlmat_pow(vvl&A, intn) {   
intm=A.size();    
vvlB(m, vl(m, 0));    
for (inti=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;    
        }    
returnB;  
    }
vvlmat_pow_rec(vvl&A, intn) {  
if (n==1) returnA;   
vvlB=mat_pow_rec(A, n/2); 
B=mat_mul(B, B);   
if (n&1) returnmat_mul(A, B);   
returnB;   
    }
intwaysToStep(intn) {  
vlf= {1, 2, 4};   
if (n<=3) returnf[n-1];     
vvlA= {{0, 0, 1}, {1, 0, 1}, {0, 1, 1}}; 
vvlB=mat_pow(A, n-3);     
llres=0;      
for (inti=0; i<3; ++i) {  
            (res+=f[i] *B[i][2]) %=p;   
        }      
returnres; 
    }
};

python

importnumpyasnpclassSolution:  
defmat_pow(self, A, n):     
m=A.shape[0]    
B=np.eye(m, dtype=np.int64)    
whilen>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>>=1returnB;        
defwaysToStep(self, n: int) ->int: 
self.p=int(1e9+7)  
f= [1, 2, 4]  
ifn<=3: returnf[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=0foriinrange(3):    
res+=f[i] *B[i][2]   
returnint(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

image.png

作者简介:godweiyang知乎同名华东师范大学计算机系硕士在读,方向自然语言处理与深度学习喜欢与人分享技术与知识,期待与你的进一步交流~

相关文章
|
3天前
|
机器学习/深度学习 存储 缓存
数据结构从入门到精通——算法的时间复杂度和空间复杂度
算法的时间复杂度和空间复杂度是评估算法性能的两个重要指标。时间复杂度主要关注算法执行过程中所需的时间随输入规模的变化情况,而空间复杂度则关注算法执行过程中所需的最大存储空间或内存空间。
85 0
|
3天前
|
搜索推荐 算法 C语言
C语言选择排序算法,从入门到精通只需1秒!
C语言选择排序算法,从入门到精通只需1秒!
|
3天前
|
算法 前端开发
|
3天前
|
存储 机器学习/深度学习 算法
|
3天前
|
机器学习/深度学习 人工智能 算法
分类算法入门:以鸢尾花数据集为例(上)
分类算法入门:以鸢尾花数据集为例(上)
37 2
|
3天前
|
机器学习/深度学习 算法 数据可视化
分类算法入门:以鸢尾花数据集为例(下)
分类算法入门:以鸢尾花数据集为例(下)
57 2
|
3天前
|
存储 算法 JavaScript
Java入门高频考查算法逻辑基础知识3-编程篇(超详细18题1.8万字参考编程实现)
解决这类问题时,建议采取下面的步骤: 理解数学原理:确保你懂得基本的数学公式和法则,这对于制定解决方案至关重要。 优化算法:了解时间复杂度和空间复杂度,并寻找优化的机会。特别注意避免不必要的重复计算。 代码实践:多编写实践代码,并确保你的代码是高效、清晰且稳健的。 错误检查和测试:要为你的代码编写测试案例,测试标准的、边缘情况以及异常输入。 进行复杂问题简化:面对复杂的问题时,先尝试简化问题,然后逐步分析和解决。 沟通和解释:在编写代码的时候清晰地沟通你的思路,不仅要写出正确的代码,还要能向面试官解释你的
35 0
|
3天前
|
存储 算法 JavaScript
【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)(二)
【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)
35 0
|
3天前
|
算法 搜索推荐 程序员
【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)(一)
【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)
41 0