zoukankan      html  css  js  c++  java
  • LeetCode_509.斐波那契数

    LeetCode-cn_509

    斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
    
    F(0) = 0,   F(1) = 1
    F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
    给定 N,计算 F(N)。
    

    示例 1:

    输入:2
    输出:1
    解释:F(2) = F(1) + F(0) = 1 + 0 = 1.
    

    示例 2:

    输入:3
    输出:2
    解释:F(3) = F(2) + F(1) = 1 + 1 = 2.
    

    示例 3:

    输入:4
    输出:3
    解释:F(4) = F(3) + F(2) = 2 + 1 = 3.
    

    提示:

    0 ≤ N ≤ 30
    

    方法一:递归方法题解

    • 测试用例:31(0~30)
    • 执行用时:18ms
    • 内存消耗:33.4MB
    class Solution {
        public int fib(int N) {
            if (N < 2) return N;
            return fib(N-1) + fib(N-2);
        }
    }
    

    方法二:动态编程方法题解

    • 测试用例:31(0~30)
    • 执行用时:1ms
    • 内存消耗:33.8MB
    class Solution {
        public int fib(int N) {
            if (N < 2) return N;
            int[] fib = new int[N+1];
            fib[0] = 0;
            fib[1] = 1;
            for (int i = 2; i <= N; i++) {
                fib[i] = fib[i-1] + fib[i-2];
            }
            return fib[N];
        }
    }
    

    方法三:矩阵幂方法题解

    • 测试用例:31(0~30)
    • 执行用时:1ms
    • 内存消耗:33.5MB
    class Solution {
        public int fib(int N) {
            if (N < 2) return N;
    		int F[][] = new int[][] { { 1, 1 }, { 1, 0 } };
    		power(F, N - 1);
    		return F[0][0];
        }
        
        void power(int F[][], int N) {
    		int M[][] = new int[][] { { 1, 1 }, { 1, 0 } };
    		for (int i = 2; i <= N; i++) {
    			mutiply(F, M);
    		}
    	}
        
        void mutiply(int F[][], int M[][]) {
    		int x = F[0][0] * M[0][0] + F[0][1] * M[1][0];
    		int y = F[0][0] * M[0][1] + F[0][1] * M[1][1];
    		int z = F[1][0] * M[0][0] + F[1][1] * M[1][0];
    		int w = F[1][0] * M[0][1] + F[1][1] * M[1][1];
    		
    		F[0][0] = x;
    		F[0][1] = y;
    		F[1][0] = z;
    		F[1][1] = w;
    	}
    }
    

    方法四:优化空间复杂度为 O(1) 题解

    • 测试用例:31(0~30)
    • 执行用时:0ms
    • 内存消耗:33.3MB
    class Solution {
        public int fib(int N) {
            if (N < 2) return N;
            int a = 0, b = 1, c;
            for (int i = 2; i <= N; i++) {
                c = a + b;
                a = b;
                b = c;
            }
            return b;
        }
    }
    
  • 相关阅读:
    013.ES6 -对象字面量增强型写法
    012. ES6
    011. ES6 语法
    10. 9. Vue 计算属性的setter和getter 以及 计算属性的缓存讲解
    4. Spring MVC 数据响应方式
    3. SpringMVC 组件解析
    9. Vue 计算属性
    【洛谷 2984】给巧克力
    【洛谷 1821】捉迷藏 Hide and Seek
    【洛谷 1821】银牛派对Silver Cow Party
  • 原文地址:https://www.cnblogs.com/wumz/p/11185489.html
Copyright © 2011-2022 走看看