(java版剑指offer)JZ10 斐波那契数列

斐波那契数列

https://www.nowcoder.com/practice/c6c7742f5ba7442aada113136ddea0c3?tpId=265&rp=1&ru=%2Fexam%2Foj%2Fta&qru=%2Fexam%2Foj%2Fta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D13&difficulty=&judgeStatus=&tags=&title=&gioEnter=menu

alt

//方法一:递归
//时间复杂度:2^n
//空间复杂度:n
public class Solution {
    public int Fibonacci(int n) {
        if(n<=1){
            return n;    //n为1,返回1;n为0,返回0
        }
        return Fibonacci(n-1) + Fibonacci(n-2);    //递归
        //f(2)=f(1)+f(0)=1+0
        //f(3)=f(2)+f(1)=1+1 = 2
    }
}
//方法二:数组存储法
//时间复杂度: n
//空间复杂度:n
public class Solution {
    public int Fibonacci(int n) {
        int[] ans = new int[40];    //新建一个数组
        ans[0] = 0;
        ans[1] = 1;
        //遍历存储1-40对应的斐波拉契数据于数组中
        for(int i=2;i<=n;i++){
            ans[i] = ans[i-1] + ans[i-2];    //每个数组下标位置存放有对应的斐波拉契数据
        }
        return ans[n];    //通过数组下标即可寻得对应的斐波拉契数据,有些费空间
    }
}
//方法三:相邻三个数存储法
//时间复杂度: n
//空间复杂度:1
public class Solution {
    public int Fibonacci(int n) {    
        if(n <= 1){
            return n;
        }
        
        //只存储相邻三个数
        int left_1 = 0;
        int left_2 = 1;
        int last = 0;
        
        for(int i=2; i<=n; i++){
            last = left_1 +left_2;
            left_1 = left_2;
            left_2 = last;
        }
        
        return last;
    }
}

//方法四:只存储相邻两个元素
//时间复杂度: n
//空间复杂度:1
public class Solution {
    public int Fibonacci(int n) {    
        if(n <= 1){
            return n;
        }
        
        //只存储相邻两个数
        int left = 0;
        int last = 1;
        for(int i=2; i<=n; i++){
            last = left + last;    //末尾元素
            left = last - left;    //相邻左边的元素
        }
        return last;
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
09-30 19:49
起名星人:蛮离谱的,直接要求转投销售
投递汇川技术等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务