该系列文章为本人刷leetcode的记录,主要旨在分享刷题的思路及算法解析(尽可能的一题多解),另方便自己日后查阅回顾。代码的实现语言是python和go。
想进大厂免不了刷题,一起加油吧,小伙伴们!
题目 offer 第10-II题 青蛙跳台阶问题链接: https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/
题目内容一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
输入:n = 2 输出:2
示例 2:
输入:n = 7 输出:21
示例 3:
输入:n = 0 输出:1解题思路
分析:令F(n)看成问题:青蛙跳上n级台阶共有多少种跳法;
由于青蛙每次只能跳一级或者两级;所以对于n级台阶来说,F(n)=F(n-1)+F(n-2)等于跳上n-1级和n-2级台阶的跳法的总和;
所以有明显的递推公式:F(n)=F(n-1)+F(n-2) (当然这个也可以看成是动态规划的公式)
解法1:递归;同样对于n过于大的使用尾递归;这题也是只需要返回最后的结果就行
解法2:动态规划: 非递归迭代;
代码实现 pythondef numWays( n: int) -> int:
#方法1:尾递归
if n==0: return 0
def recur_tail(n,f0,f1):
if n==1: return 1
elif n==2: return 2
elif n==3: return f0+f1
else : return recur_tail(n-1,f1,f0+f1)
return recur_tail(n,1,2)
#方法2:动态规划;非递归迭代解法;
# if n<3: return n
# else:
# f1,f2 = 1,2
# for i in range(3,n+1):
# fn = f1+f2
# f1 = f2
# f2 = fn
# return fn
go
//方法1:尾递归
//if n==0{return 0}
//const mod int = 1e9+7
//var recur_tail func(n,f1,f2 int) int
//recur_tail = func(n,f1,f2 int) int{
// if n==1{return 1
// }else if n==2{return 2
// }else if n==3{return (f1+f2)%mod
// }else{return recur_tail(n-1,f2%mod,(f1+f2)%mod)}
//}
//
//return recur_tail(n,1,2)
//
动态规划;非递归迭代算法
var fn int
const mod int =1e9+7
if n<3{return n
}else{
f1,f2 := 1,2
i :=3
for ;i
总结
注意尾递归的使用还要递归层次的设计(递归到哪一层截止);



