青蛙跳台阶c语言递归函数,【递归】青蛙跳台阶问题

题目描述:

思路一:递归

此类求多少种可能性的题目一般都有递推性质 ,即 f(n)和 f(n−1)…f(1) 之间是有联系的

f(0)=1

f(1)=1

f(2)=2

f(3)=3

f(4)=5

....

以上类似斐波那契数列,不同的是斐波那契数列f(0)=0

1 classSolution {2 public:3 int numWays(intn) {4 if(n==0||n==1)5 return 1;6 return numWays(n-1)+numWays(n-2);7 }8 };

时间复杂度O(2n)

空间复杂度O(n)

思路二:动态规划

动态规划解析:

状态定义: 设 dpdp 为一维数组,其中 dp[i]dp[i] 的值代表 斐波那契数列第 $i$ 个数字 。

转移方程: dp[i + 1] = dp[i] + dp[i - 1]dp[i+1]=dp[i]+dp[i−1] ,即对应数列定义 f(n + 1) = f(n) + f(n - 1)f(n+1)=f(n)+f(n−1) ;

初始状态: dp[0] = 1dp[0]=1, dp[1] = 1dp[1]=1 ,即初始化前两个数字;

返回值: dp[n]dp[n] ,即斐波那契数列的第 nn 个数字。

解析链接:https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/solution/mian-shi-ti-10-ii-qing-wa-tiao-tai-jie-wen-ti-dong/

注意不需要判断n=0和n=1的情况,如果判断会大大增加runtime。

1 classSolution {2 public:3 int numWays(intn) {4 vector v(n + 1, 1);5 for(int i = 2; i <= n; i++)6 v[i] = (v[i - 1] + v[i - 2]) % 1000000007;7 return v[n];//直接返回最后一个数

8

9 }10 };

时间复杂度O(n)

空间复杂度O(n)

思路三:斐波那契

1 classSolution {2 public:3 int numWays(intn) {4 if(n==0||n==1)5 return 1;6 int s1=1,s2=1,s3;7 for(int i=2;i<=n;i++){8 s3=(s1+s2)%1000000007;9 s1=s2;10 s2=s3;11 }12 returns3;;13 }14 };

时间复杂度O(n)

空间复杂度O(1)

其中关于1000000007的问题可见  https://www.liuchuo.net/archives/645

原文:https://www.cnblogs.com/PennyXia/p/12776158.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值