每日一道算法题2021-10-15

123 阅读1分钟
JZ10 斐波那契数列
## 描述
大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项。

斐波那契数列是一个满足 
fib(x)={ 1  x= (1,2) }
fib(x)= fib(x-1)+fib(x-2) {x>2} 的数列
数据范围:1\leq n\leq 391≤n≤39
要求:空间复杂度 O(1),时间复杂度 O(n),本题也有时间复杂度 O(logn)O 的解法
输入描述:
一个正整数n
返回值描述:
输出一个正整数。

比较简单
/**
 * 裴波那契数列
 * if (x == 1 || x == 2) f(x) = 1
 * if (x >2 )  f(x) = f(x-1) + f(x-2)
 * 递归思路解题
 * */
public static int Fibonacci(int n) {
    // 判断n
    if (n ==0) {
        return 0;
    } else if (n == 1) {
        return 1;
    } else {
        return Fibonacci(n-1) + Fibonacci(n-2);
    }
}

/**
 * 数学归纳法
 *0 1 1 2 3 5 8 13 21 34 55
 * f(n) = f(n-1) + f(n-2)
 * */
public static int Fibonacci(int n) {
    // 判断n
    if (n <= 1) {
        return n;
    }
    int [] dp = new int[n+1];
    dp[0] = 0;
    dp[1] = 1;
    for (int j = 2; j <= n; j++) {
        dp[j] = dp[j-1] + dp[j-2];
    }
    return dp[n];
}

JZ69 跳台阶
## 描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
数据范围:0≤n≤40
要求:时间复杂度:O(n) ,空间复杂度: O(1)
解题思路
f(1) = 1
f(2) = 2 先跳1级再跳1级 || 直接挑2if(n > 1)
public static int jumpFloor(int n) {
    if (n == 0) {
        return 0;
    } else if (n == 1) {
        return 1;
    } else if (n == 2) {
        return 2;
    } else {
        return jumpFloor(n-1) + jumpFloor(n-2);
    }
}