算法

  1. 动态规划

    题目1:

    写一个函数,输入 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. 然后是动态规划,要计算第三个数,只需要知道前面两个数即可,而最开始的两个很容易得出。再下一次计算中舍弃第一个,保留第二三个数。作为下一轮的第一二位。如此重复操作即可。(就是一个循环的问题)

    代码

    public class Fib {
        //测试
        public static void main(String[] args) {
            System.out.println(fib(22));
            System.out.println(fib01(1000));
        }
    	//思路1
        public static int fib(int n) {
            if (n == 0 || n == 1) {
                return n;
            }
            return fib(n - 1) + fib(n - 2);
        }
    
    	//思路2
        public static int fib01(int n) {
            if (n < 2) {
                return n;
            }
            final int MOD = 1000000007;
            int a = 0;
            int b = 1;
            int c = 0;
            for (int i = 1; i < n; i++) {
                c = (a + b) % MOD;
                a = b;
                b = c;
            }
            return c;
        }
    }
    

    题目2:

    一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n级的台阶总共有多少种跳法。
    
    答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
    
    示例 1:
    
    输入:n = 2
    输出:2
    示例 2:
    
    输入:n = 7
    输出:21
    示例 3:
    
    输入:n = 0
    输出:1
    
    

    思路:上一题的变形

    代码

    public class NumWays {
        public static void main(String[] args) {
            System.out.println(numWays(7));
        }
    
        //斐波那契数列变形 f(1)=1 f(2)=2;
        //跳上最后一级台阶的为f(n)跳上最后一阶台阶只有两种方法,f(n-1)跳一步上台阶,f(n-2)跳两步上台阶。(如果觉得不好接受,画个三步台阶,要跳上第三步台阶的方法,一步跳上,两步跳上)
        public static int numWays(int n) {
            final int MOD = 1000000007;
            if (n == 0) {
                return 1;
            }
            if (n < 3) {
                return n;
            }
            int a = 1;
            int b = 2;
            int c = -1;
            for (int i = 2; i < n; i++) {
                c = (a + b) % MOD;
                a = b;
                b = c;
            }
            return c;
        }
    }
    
    
posted on 2021-09-06 21:28  需要多勇敢  阅读(222)  评论(0)    收藏  举报