当前位置:   article > 正文

01 动态规划 --斐波那契数列_动态规划之—斐波那契数列

动态规划之—斐波那契数列

1.暴力递归

  1. int fib(int n) {
  2. if (n == 0) {
  3. return 0;
  4. }
  5. if (n == 1 || n == 2) {
  6. return 1;
  7. }
  8. return fib(n - 1) + fib(n - 2);
  9. }

由于暴力递归斐波那契数列问题,时间复杂度为O(2^n),并且有很多重复计算。所以有针对重复子问题进行简化。简化的方法有两种,备忘录法和DPTable法。

2.备忘录

自定向下计算的方法。

  1. int fib(int N) {
  2. if (N = 0) {
  3. return 0
  4. }
  5. int arr[] = new int[N+1];
  6. return helper(arr, N);
  7. }
  8. int helper(int[] arr, int n) {
  9. if (n == 1 || n == 2) {
  10. return 1;
  11. }
  12. //已经计算过,防止重复计算。
  13. if (arr[n] != 0) {
  14. return arr[n];
  15. }
  16. helper(arr, n-1) + helper(arr, n-2);
  17. return arr[n];
  18. }

3.dp数组迭代解法

  1. int fib(int N) {
  2. if (N == 0) {
  3. return 0;
  4. }
  5. if (N == 1 || N == 2) {
  6. return 1;
  7. }
  8. int dp[] = new int[N + 1];
  9. //基本case
  10. dp[1] = dp[2] = 1;
  11. for (int i = 3; i <= N;i++;) {
  12. dp[i] = dp[i-1] + dp[i+1];
  13. }
  14. return dp[N];
  15. }

4. 由于斐波那契问题只需要保存当前的前两个数字的状态,所以不需要用数组把所有数字保存起来。所以最优解如下:

  1. int fib(int N) {
  2. if (N == 0) {
  3. return 0;
  4. }
  5. if (N == 1 || N == 2) {
  6. return 1;
  7. }
  8. int cur = 1;
  9. int prev = 1;
  10. for (int i = 3; i <= N; i++) {
  11. int sum = cur + prev;
  12. prev = cur;
  13. cur = sum;
  14. }
  15. return cur;
  16. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/573428
推荐阅读
相关标签
  

闽ICP备14008679号