diff --git a/20230109.md b/20230109.md
index 497ea4db..28daf789 100644
--- a/20230109.md
+++ b/20230109.md
@@ -114,6 +114,12 @@ if 其他特殊情况:
做该做的事情()
```
+Note:
+避免嵌套的基本思想就是early return,就是说进入函数之后,
+先处理特殊情况和各种边界情况,处理完之后直接return这个函数,也就是early return.
+最后再开始做函数该做的事情,一般来说这都是比较好的写法,如果你去看golang代码,
+你能看到大量这样的写法,这也是golang社区和官方建议的写法。
+
---
### 15. 3Sum
@@ -145,6 +151,22 @@ sum([i ** 2 for i in range(100) if i % 7 == 0])
```python []
list(itertools.combinations([1,2,3,4], 3))
# [(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]
+
+Note:
+这题的解法其实也就一行,就是4-8行的这个列表生成式,那么列表生成式是什么捏。
+列表生成式又叫做List comprehensions, 这里有个例子,假设我们要求0到100所有能被7整除数的平方和,
+这个计算用列表生成式一行就能实现。首先最开始是个sum函数,sum函数里面是一个列表,
+这个列表是中的每一个元素都是i的平方,那么i从哪里来的呢,i是for i in range(100) 这个循环中出来的,
+并且i满足i除以7的余数是0这个条件。
+
+回到4-8行,ret是一个集合,集合中每个元素是 **经过排序** 的 **元组** test,
+test从哪里来呢,test 是 第七行 这个for循环迭代出来的变量,并且这个test满足第八行的这个求和等于0的条件。
+
+那么这个itertools.combinations是什么函数呢,它是标准库中提供的排列组合迭代器。
+下面给各位回忆一下高中排列组合的知识,假设我们有一个列表,列表中有元素1 2 3 4,每次取三个不同的元素,
+那么一共有多少中不同的排列组合呢。用combinations函数就能非常方便的帮我们遍历所有排列组合。
+
+理论上,这题就这么可以解出来了,但是实际上是不行的
```
---
@@ -224,7 +246,7 @@ def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
Note:
这道题其实也就两行代码,第一行是将people排序,第二行是在新数组中指定位置插入元素。
-至于这么神奇的思路是怎么想到的,我只能说我也不知道,我自己写的很复杂有差不多100行。
+解题的关键就在利用了插入排序的特性,列表中后来插入的元素把之前插入的元素往后推一个位置。
但题外话我想提一下,
我们写算法关注算法性能,这没问题,但我自己个人是把代码简洁度看得比性能更重的。
@@ -269,9 +291,14 @@ int main() {
---
+### C++ 标准库中的排序(以C11为例)
+
+- 快速排序平均复杂度为 `$O(N log N)$` ,最坏情况下为 `$O(N^2)$`,快排递归带来额外开销
+- 堆排序比快排慢,但最坏情况下为 `$(N log N)$`
+- 插入排序在大致有序的情况下表现非常好
+
+`std::sort` 实现了 Introspective sorting,集成了三种算法各自的优点
+
+---
+
## End 🎉
-
-感谢聆听
-
-- 本 Slide 地址:
-- Markdown 地址: