寻找用户推荐人
题目传送门: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种方法
所以可知其所求方法种数公式为
朴素代码:
class Solution {
public int climbStairs(int n) {
if(n<=2) return n;
return f(n-1) + f(n-2);
}
}
时间复杂度 ,空间复杂度
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)"]
从上图中的递归树就可以看出部分数据存在多次计算。
记忆化递归
时间复杂度: 空间复杂度:
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];
}
}
动态规划
核心思想: 通过状态转移和滚动技术:
- 只需要保留前两个状态
- 通过迭代更新状态
- 最终结果存储在最后一个状态
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)
}