【每日算法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知乎同名华东师范大学计算机系硕士在读,方向自然语言处理与深度学习喜欢与人分享技术与知识,期待与你的进一步交流~

相关文章
|
2月前
|
机器学习/深度学习 人工智能 算法
深度学习入门:理解神经网络与反向传播算法
【9月更文挑战第20天】本文将深入浅出地介绍深度学习中的基石—神经网络,以及背后的魔法—反向传播算法。我们将通过直观的例子和简单的数学公式,带你领略这一技术的魅力。无论你是编程新手,还是有一定基础的开发者,这篇文章都将为你打开深度学习的大门,让你对神经网络的工作原理有一个清晰的认识。
|
1月前
|
机器学习/深度学习 算法
机器学习入门(三):K近邻算法原理 | KNN算法原理
机器学习入门(三):K近邻算法原理 | KNN算法原理
|
1月前
|
机器学习/深度学习 算法 大数据
机器学习入门:梯度下降算法(下)
机器学习入门:梯度下降算法(下)
|
1月前
|
机器学习/深度学习 算法 API
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
|
1月前
|
机器学习/深度学习 算法
机器学习入门:梯度下降算法(上)
机器学习入门:梯度下降算法(上)
|
3月前
|
机器学习/深度学习 人工智能 算法
AI入门必读:Java实现常见AI算法及实际应用,有两下子!
本文全面介绍了人工智能(AI)的基础知识、操作教程、算法实现及其在实际项目中的应用。首先,从AI的概念出发,解释了AI如何使机器具备学习、思考、决策和交流的能力,并列举了日常生活中的常见应用场景,如手机助手、推荐系统、自动驾驶等。接着,详细介绍了AI在提高效率、增强用户体验、促进技术创新和解决复杂问题等方面的显著作用,同时展望了AI的未来发展趋势,包括自我学习能力的提升、人机协作的增强、伦理法规的完善以及行业垂直化应用的拓展等...
185 3
AI入门必读:Java实现常见AI算法及实际应用,有两下子!
|
3月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
52 6
|
3月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
50 1
|
3月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
61 1
|
4月前
|
机器学习/深度学习 数据采集 人工智能
机器学习算法入门与实践
【7月更文挑战第22天】机器学习算法入门与实践是一个既充满挑战又极具吸引力的过程。通过掌握基础知识、理解常见算法、注重数据预处理和模型选择、持续学习新技术和参与实践项目,你可以逐步提高自己的机器学习技能,并在实际应用中取得优异的成绩。记住,机器学习是一个不断迭代和改进的过程,保持好奇心和耐心,你将在这个领域走得更远。
下一篇
无影云桌面