题目描述:
- 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39
- 地址:牛客地址
解决方法
- 这是个很好的例子,用来理解从递归到动态规划,再到动态规划的优化
- 方法1:递归
- 利用公式 f(0) = 0, f(1) = 1; f(n) = f(n-1) + f(n-2), n >= 2时
- 但是这样会造成重复计算,当n比较大时引发栈溢出。例如,计算f(4)要递归计算f(3)和f(2),而当计算f(3)时,又要计算一次f(2)。
- 方法2:动态规划
- 用dp[n]来存储f(n)的值,根据递归的base case 可知,dp[0] = 0, dp[1] = 1,剩下的可以根据依赖关系依次填好整个dp一维数组,从而得到dp[n].
- 方法3:动态规划的空间优化(压缩空间)
- 根据填dp数组的方式,可以发现,我们填dp[n]时,只依赖于dp[n-2]与dp[n-1],所以我们只需要维持前两个变量 curValue 和 preValue即可,比方法2更加节省空间。</