zoukankan      html  css  js  c++  java
  • 剑指offer:斐波那契数列

    题目:写一个函数,输入n求斐波那契数列的第n项。


    暴力简单解法:
    1. long long Fibonacci(unsigned int n)
    2. {
    3. if(n<=0)
    4. return 0;
    5. if(n==1)
    6. return 1;
    7. return Fibonacci(n-1)+Fabonacci(n-2);
    8. }
    利用循环改进之后,这个的时间复杂度是o(n)
    1. // ====================方法2:循环====================
    2. long long Fibonacci_Solution2(unsigned n)
    3. {
    4. int result[2] = {0, 1};
    5. if(n < 2)
    6. return result[n];
    7. long long fibNMinusOne = 1;
    8. long long fibNMinusTwo = 0;
    9. long long fibN = 0;
    10. for(unsigned int i = 2; i <= n; ++ i)
    11. {
    12. fibN = fibNMinusOne + fibNMinusTwo;
    13. fibNMinusTwo = fibNMinusOne;
    14. fibNMinusOne = fibN;
    15. }
    16. return fibN;
    17. }
    第三种方法:利用如下的一个公式


    1. // ====================方法3:基于矩阵乘法====================
    2. #include <cassert>
    3. struct Matrix2By2
    4. {
    5. Matrix2By2
    6. (
    7. long long m00 = 0,
    8. long long m01 = 0,
    9. long long m10 = 0,
    10. long long m11 = 0
    11. )
    12. :m_00(m00), m_01(m01), m_10(m10), m_11(m11)
    13. {
    14. }
    15. long long m_00;
    16. long long m_01;
    17. long long m_10;
    18. long long m_11;
    19. };
    20. Matrix2By2 MatrixMultiply
    21. (
    22. const Matrix2By2& matrix1,
    23. const Matrix2By2& matrix2
    24. )
    25. {
    26. return Matrix2By2(
    27. matrix1.m_00 * matrix2.m_00 + matrix1.m_01 * matrix2.m_10,
    28. matrix1.m_00 * matrix2.m_01 + matrix1.m_01 * matrix2.m_11,
    29. matrix1.m_10 * matrix2.m_00 + matrix1.m_11 * matrix2.m_10,
    30. matrix1.m_10 * matrix2.m_01 + matrix1.m_11 * matrix2.m_11);
    31. }
    32. Matrix2By2 MatrixPower(unsigned int n)
    33. {
    34. assert(n > 0);
    35. Matrix2By2 matrix;
    36. if(n == 1)
    37. {
    38. matrix = Matrix2By2(1, 1, 1, 0);
    39. }
    40. else if(n % 2 == 0)
    41. {
    42. matrix = MatrixPower(n / 2);
    43. matrix = MatrixMultiply(matrix, matrix);
    44. }
    45. else if(n % 2 == 1)
    46. {
    47. matrix = MatrixPower((n - 1) / 2);
    48. matrix = MatrixMultiply(matrix, matrix);
    49. matrix = MatrixMultiply(matrix, Matrix2By2(1, 1, 1, 0));
    50. }
    51. return matrix;
    52. }
    53. long long Fibonacci_Solution3(unsigned int n)
    54. {
    55. int result[2] = {0, 1};
    56. if(n < 2)
    57. return result[n];
    58. Matrix2By2 PowerNMinus2 = MatrixPower(n - 1);
    59. return PowerNMinus2.m_00;
    60. }






  • 相关阅读:
    [LeetCode] 226. Invert Binary Tree
    [LeetCode] 101. Symmetric Tree
    [LeetCode] 100. Same Tree
    [LeetCode] 104. Maximum Depth of Binary Tree
    [LeetCode] 280. Wiggle Sort
    [LeetCode] 42. Trapping Rain Water
    [LeetCode] 190. Reverse Bits
    [LeetCode] 144. Binary Tree Preorder Traversal
    [Leetcode] 58. Length of Last Word
    [LeetCode] 16. 3Sum Closest
  • 原文地址:https://www.cnblogs.com/zhuzhenfeng/p/4664484.html
Copyright © 2011-2022 走看看