题目描述:
思路一:递归
此类求多少种可能性的题目一般都有递推性质 ,即 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 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