剑指offer:斐波那契数列

题目:

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39

思路:

递归直观,但n太大时递归层数太多,时间复杂度高;采用循环实现,时间复杂度为O(N)

还有一种复杂度O(log(N))的方法,利用矩阵性质[f(n) f(n-1); f(n-1),f(n-2)]=[1 1; 1 0]^(n-1),转化为求矩阵乘方,但这种方法并不是很实用。

代码:

在线测试OJ:

https://www.nowcoder.com/practice/c6c7742f5ba7442aada113136ddea0c3?tpId=13&tqId=11160&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

AC代码:

class Solution {
public:
    //循环
    int Fibonacci(int n) {
	if(n < 0)
		return -1;
	if(n == 0)
		return 0;
	if(n == 1)
		return 1;
        int n_1 = 1;
        int n_2 = 0;
	int f_n;
	for(int i = 2; i <= n; i++)
	{
		f_n = n_1 + n_2;
		n_2 = n_1;
		n_1 = f_n;
	}
	return f_n;
    }
};

递归的也贴在这,但牛客网上无法通过。

class Solution {
public:
    //递归
    int Fibonacci(int n) {
	if(n < 0)
		return -1;
	if(n == 0)
		return 0;
	if(n == 1)
		return 1;
        return Fibonacci(n - 1) + Fibonacci(n - 2);
    }
};

还有更高效的算法,待补充。。。

猜你喜欢

转载自blog.csdn.net/u012991043/article/details/81027806
今日推荐