【递归】青蛙跳台阶问题

题目描述:

思路一:递归

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

f(0)=1 

f(1)=1 

f(2)=2 

f(3)=3

f(4)=5

....

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

1 class Solution {
2 public:
3     int numWays(int n) {
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 class Solution {
 2 public:
 3     int numWays(int n) {
 4         vector<int> 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 class Solution {
 2 public:
 3     int numWays(int n) {
 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         return s3;;
13     }
14 };

时间复杂度O(n)

空间复杂度O(1)

 

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

 

posted @ 2020-04-25 23:15  PennyXia  阅读(558)  评论(0编辑  收藏  举报