leetcode刷题(剑指offer) 509(1)

F

n

1

F

n

2

F

n

1

)

(\begin{matrix}F_n&F_{n-1}\F_{n-1}&F_{n-2}\end{matrix}) * (\begin{matrix}1&1\1&0\end{matrix}) = (\begin{matrix}F_n + F{n-1}&F_n\F_{n-1} + F_{n-2}&F_{n-1}\end{matrix})

(Fn​Fn−1​​Fn−1​Fn−2​​)∗(11​10​)=(Fn​+Fn−1Fn−1​+Fn−2​​Fn​Fn−1​​)

根据斐波那契迭代的公式可以推得

  • F

n

F

n

1

=

F

n

1

F_n + F_{n-1} = F_{n + 1}

Fn​+Fn−1​=Fn+1​

  • F

n

=

F

n

F_n = F_n​

Fn​=Fn​​

  • F

n

1

F

n

2

=

F

n

F_{n-1} + F_{n - 2} = F_n

Fn−1​+Fn−2​=Fn​

  • F

n

1

=

F

n

1

F_{n-1} = F_{n-1}

Fn−1​=Fn−1​

由此可以得出结论。

A

n

(

1

1

1

0

)

=

(

A

n

1

)

A_n * (\begin{matrix}1&1\1&0\end{matrix}) = (A_{n+1})

An​∗(11​10​)=(An+1​)

只需要记录第n-1项,第n-2项,第n项,就可以使用乘法的方法来计算出第n+1项。

根据上式得到最终递推式如下:

A

n

=

(

1

1

1

0

)

n

1

A_n = {(\begin{matrix}1&1\1&0\end{matrix})}^{n-1}

An​=(11​10​)n−1

到了这一步,直接使用矩阵乘法来计算的话,最终的时间复杂度为O(n)。但是乘法的话存在快速幂运算的计算方法,使用快速幂运算,可以将运算的时间复杂度进一步降低。

快速幂运算逻辑如下:

计算a的n次方,如果a是偶数,那就直接计算

a

n

/

2

a

n

/

2

a^{n/2} * a^{n/2}

an/2∗an/2,如果是奇数就计算a乘上

a

n

1

a^{n-1}

an−1。

代码如下:

public static int fib(int n) {
    if (n == 0) {
        return 0;
    } else if (n == 1) {
        return 1;
    }
    int[][] matrix = new int[][]{
        {1, 1},
        {1, 0}
    };
    matrix = powerMatrix(matrix, n - 1);
    return matrix[0][0];
}

public static int[][] powerMatrix(int[][] matrix, int n) {
    if (n <= 1) {
        return matrix;
    } else if (n % 2 == 0){
        matrix = powerMatrix(matrix, n / 2);
        matrix = matrixMul(matrix, matrix);
        return matrix;
    } else {
        return matrixMul(matrix, Objects.requireNonNull(powerMatrix(matrix, n - 1)));
**先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前在阿里**

**深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/40298e6279ce3ee6df6427e5cc4d663e.png)
![img](https://img-blog.csdnimg.cn/img_convert/aa3eb9686efd8ff56369c12c873e978c.png)
![img](https://img-blog.csdnimg.cn/img_convert/2d9e28e8de90d1c67dd93555cc578d07.png)
![img](https://img-blog.csdnimg.cn/img_convert/a6b6c42f5edb02a24d7e7cb3633d56ed.png)
![img](https://img-blog.csdnimg.cn/img_convert/23d248bd6d9581f0e6b20f0126c072b9.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**

是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
[外链图片转存中...(img-GQkoyFJC-1714251808153)]
[外链图片转存中...(img-Y22VytQV-1714251808154)]
[外链图片转存中...(img-SMtmpHya-1714251808154)]
[外链图片转存中...(img-f5h3UZae-1714251808155)]
[外链图片转存中...(img-HhYGNkkt-1714251808155)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值