算法
-
动态规划
题目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; } }
浙公网安备 33010602011771号