刷题日记-1

40 阅读2分钟

寻找用户推荐人

题目传送门:leetcode.cn/problems/fi…

SELECT name FROM customer WHERE referee_Id = 2;

返回的结果中所有推荐人为NULL 的人都消失了。

MySQL 使用三值逻辑 —— TRUE, FALSE 和 UNKNOWN。任何与 NULL 值进行的比较都会与第三种值 UNKNOWN 做比较。这个“任何值”包括 NULL 本身!这就是为什么 MySQL 提供 IS NULL 和 IS NOT NULL 两种操作来对 NULL 特殊判断。

正确写法:

SELECT name FROM customer WHERE referee_Id = 2 or referee_Id is NULL;

无效的推文

题目传送门:leetcode.cn/problems/in…

mysql统计字符串长度

  • CHAR_LENGTH 或者 CHARACTER_LENGTH: 返回字符串中的字符数(包括空格),以字符为单位计算,不受多字节字符影响

  • LENGTH: 返回字符串的字节长度(包括空格),对于多字节字符(如中文),一个字符可能占多个字节。

爬楼梯

假设你正在爬楼梯,需要n阶才能到楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

n=1   -> 1种方法
n=2   -> 1+1 2  2种方法
n=3   -> 1+1+1 1+2 2+2  3种方法
n=4   -> 1+1+1+1 1+2+1  1+1+2  2+1+1 2+2  5种方法

所以可知其所求方法种数公式为f(n)=f(n1)+f(n2)f(n) = f(n-1) + f(n-2)

朴素代码:

class Solution {
    public int climbStairs(int n) {
        if(n<=2) return n;
        return f(n-1) + f(n-2);
    }
}

时间复杂度 O(2n)O(2^n),空间复杂度O(n)O(n)

graph TD
    A["f(5)"] --> B["f(4)"]
    A --> C["f(3)"]
    B --> D["f(3)"]
    B --> E["f(2)"]
    C --> F["f(2)"]
    C --> G["f(1)"]
    D --> H["f(2)"]
    D --> I["f(1)"]

从上图中的递归树就可以看出部分数据存在多次计算。

记忆化递归

时间复杂度:O(n)O(n) 空间复杂度:O(n)O(n)

class Solution {
    public int climbStairs(int n) {
        if(n<=2) return n;
        int[] arr = new int[n+1];
        return hopm(n,arr);
    }

    public int hopm(int n,int[] arr){
        if(n <= 2) return n;
        if(arr[n] > 0) return arr[n];
        arr[n] = hopm(n-1,arr) + hopm(n-2,arr);
        return arr[n]; 
    }
}

动态规划

核心思想: 通过状态转移和滚动技术:

  1. 只需要保留前两个状态
  2. 通过迭代更新状态
  3. 最终结果存储在最后一个状态
public int climbStairs(int n) {
    if (n <= 2) return n; // 边界条件
    int a = 1, b = 2;     // 初始化:
                          // a代表f(1)=1, b代表f(2)=2
    for (int i = 3; i <= n; i++) {
        int c = a + b;    // f(i) = f(i-2) + f(i-1)
        a = b;            // 更新f(i-2)为上一轮的f(i-1)
        b = c;            // 更新f(i-1)为当前计算的f(i)
    }
    return b; // 最终b存储f(n)
}