您当前的位置: 首页 >  leetcode

孑渡

暂无认证

  • 2浏览

    0关注

    178博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Leetcode】剑指Offer10:斐波那契数列

孑渡 发布时间:2022-08-30 20:58:30 ,浏览量:2

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1. 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。 示例 1: 输入:n = 2 输出:1 示例 2: 输入:n = 5 输出:5 提示: 0 = 1000000007) { result -= 1000000007; } first = second; second = result; } return result; } }

这个解答当中主要有一个小的优化,不选择复杂的取模算法而是选择了减去1e9+7,这种方法可以提高运算效率。

class Solution:
    def fib(self, n: int) -> int:
        MOD = 10 ** 9 + 7
        if n  List[List[int]]:
            c = [[0, 0], [0, 0]]
            for i in range(2):
                for j in range(2):
                    c[i][j] = (a[i][0] * b[0][j] + a[i][1] * b[1][j]) % MOD
            return c

        def matrix_pow(a: List[List[int]], n: int) -> List[List[int]]:
            ret = [[1, 0], [0, 1]]
            while n > 0:
                if n & 1:
                    ret = multiply(ret, a)
                n >>= 1
                a = multiply(a, a)
            return ret

        res = matrix_pow([[1, 1], [1, 0]], n - 1)
        return res[0][0]

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/fei-bo-na-qi-shu-lie-lcof/solution/fei-bo-na-qi-shu-lie-by-leetcode-solutio-hbss/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

此解法首先需要构建矩阵。 在这里插入图片描述 有了矩阵的递推公式之后,问题就被转化为了求解该常数矩阵的快速幂。 快速幂求解过程中有几个小技巧:

  • n & 1:位运算快速判断是否为奇数
  • n >>= 1:位运算除以2

这题的解法非常巧妙,是矩阵的一个很好的应用。此外,根据评论区的网友说法,字节面试时会要求手撕出O(logn)的解法,说明这类基础题的优化方案的要求会非常的高。

关注
打赏
1663211900
查看更多评论
立即登录/注册

微信扫码登录

0.0372s