文章目录
版权声明
- LeetCode 系列笔记来源于 LeetCode 题库1,在个人思考的基础之上博采众长,受益匪浅;故今记此文,感怀于心,更多题解及程序,参见 Github2;
 - 该系列笔记不以盈利为目的,仅用于个人学习、课后复习及交流讨论;
 - 如有侵权,请与本人联系(hqpan@foxmail.com),经核实后即刻删除;
 - 本文采用 署名-非商业性使用-禁止演绎 4.0 国际 (CC BY-NC-ND 4.0) 协议发布;
 
1. LeetCode 70
1.1 复杂度分析
- 题意解析:
- LeetCode 70 爬楼梯问题,亦称青蛙跳台阶问题,该问题的数学模型为 Fibonacci 数列;
- 设 n 级台阶的跳法有种,则由跳台阶规则可知,;
 
 - 类似的实际问题还有矩形覆盖问题,给定由个小方格组成的大矩形,和一个由$2\times $1个小方格组成的小矩形,若使用小矩形覆盖大矩形,试求共有多少种方法?
- 不妨将的覆盖方法数记为,若将1个小矩形竖放于大矩形中,则剩余,即剩余区域的覆盖方法数记为;
 - 若将1个小矩形横放于大矩形的左上角,由几何关系知,左下角必须再次横放一个小矩形,剩余,即剩余区域的覆盖方法数记为;
 - 综上所述,可知;
 
 
 - LeetCode 70 爬楼梯问题,亦称青蛙跳台阶问题,该问题的数学模型为 Fibonacci 数列;
 - 递归:
- 时间复杂度:;
 - 空间复杂度:;
 
 - 迭代:
- ·时间复杂度:;
 - 空间复杂度:;
 
 - 递归和迭代的比较:
- 递归:
- 优点:
- 形式简洁;
 - 若面试时不允许使用递归,则可使用栈模拟递归过程;
 
 - 缺点:
- 递归中部分计算内容是重复的,造成不必要的时间开销,可借助递归思想分析问题,使用迭代的思想自底向上求解;
 - 每次函数调用时,都需要在内存栈中分配空间保存参数、返回地址和临时变量;
 - 由于每个进程的栈容量有限,若递归层数过多,则会造成栈溢出;
 
 
 - 优点:
 
 - 递归:
 
1.2 迭代
- 为什么不使用递归求解?
- 递归求解 Fibonacci 数列时,会重复计算部分内容;
 - E.g. ,如需求解,应先求和,而求解的过程中,递归调用会再一次求解;
 - 本题中若使用递归求解,则会超出时间限制;
 
 - 难点:
- Q1:两种方法的区别?
- Approach 1:创建一个长度为n的数组,存放;
 - Approach 2:创建两个变量,用于保存 Fibonacci 数列中的前两项;
 
 - A1:Approach 2 能将空间复杂度从减小至;
 
 - Q1:两种方法的区别?
 
class Solution {
    public int climbStairs(int n) {
        if (n <= 2)
            return n;
        int lo = 1;
        int hi = 2;
        int ans = -1;
        while (n-- > 2) {
            ans = hi + lo;
            lo = hi;
            hi = ans;
        }
        return ans;
    }
}
2. LeetCode 509
2.1 复杂度分析
- LeetCode 509 和 70 、1137 的解题思路基本一致;
 
2.2 递归
- 难点:
- Java 强制要求处理
Exception(即含有catch语句),但对RuntimeException无强制要求; 
 - Java 强制要求处理
 
class Solution {
    public int fib(int N) {
        if (N < 0)
            throw new RuntimeException("Input N >= 0.");
        if (N <= 1)
            return N;
        return fib(N - 1) + fib(N - 2);
    }
}
2.3 迭代
class Solution {
    public int fib(int N) {
        if (N < 0)
            throw new RuntimeException("Input N >= 0.");
        if (N <= 1)
            return N;
        int lo = 0;
        int hi = 1;
        int ans = -1;
        while (N-- > 1) {
            ans = hi + lo;
            lo = hi;
            hi = ans;
        }
        return ans;
    }
}
3. LeetCode 1137
2.1 复杂度分析
- LeetCode 1137 和 70 、509 的解题思路基本一致;
 
2.2 迭代
- 本题中若使用递归求解,则会超出时间限制;
 
class Solution {
    public int tribonacci(int n) {
        if (n < 0)
            throw new RuntimeException("Input n >= 0.");
        if (n < 2)
            return n;
        int num0 = 0;
        int num1 = 1;
        int num2 = 1;
        int ans = 1;
        while (n-- > 2) {
            ans = num2 + num1 + num0;
            num0 = num1;
            num1 = num2;
            num2 = ans;
        }
        return ans;
    }
}
References
来源:CSDN
作者:Andrew*
链接:https://blog.csdn.net/Maximize1/article/details/104129306