Skip to content

Commit 1bc5e8e

Browse files
committed
修改了目录结构
1 parent 0ef8e04 commit 1bc5e8e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+222
-43
lines changed

README.md

+22-14
Original file line numberDiff line numberDiff line change
@@ -14,27 +14,36 @@
1414

1515
# 二、文章目录
1616

17+
* 第零章、必读系列
18+
* [学习算法和刷题的思路指南](算法思维系列/学习数据结构和算法的高效方法.md)
19+
* [学习数据结构和算法读什么书](算法思维系列/为什么推荐算法4.md)
20+
* [动态规划详解](动态规划系列/动态规划详解进阶.md)
21+
* [动态规划答疑篇](动态规划系列/最优子结构.md)
22+
* [回溯算法详解](算法思维系列/回溯算法详解修订版.md)
23+
* [二分查找详解](算法思维系列/二分查找详解.md)
24+
* [双指针技巧总结](算法思维系列/双指针技巧.md)
25+
* [滑动窗口技巧](算法思维系列/滑动窗口技巧.md)
26+
* [Linux的进程、线程、文件描述符是什么](技术/linux进程.md)
27+
* [Git/SQL/正则表达式的在线练习平台](技术/在线练习平台.md)
1728
* 第一章、动态规划系列
1829
* [动态规划详解](动态规划系列/动态规划详解进阶.md)
1930
* [动态规划答疑篇](动态规划系列/最优子结构.md)
2031
* [动态规划设计:最长递增子序列](动态规划系列/动态规划设计:最长递增子序列.md)
21-
* [经典动态规划:编辑距离](动态规划系列/编辑距离.md)
22-
* [经典动态规划:高楼扔鸡蛋](动态规划系列/高楼扔鸡蛋问题.md)
23-
* [经典动态规划:高楼扔鸡蛋(进阶)](动态规划系列/高楼扔鸡蛋进阶.md)
32+
* [编辑距离](动态规划系列/编辑距离.md)
33+
* [经典动态规划问题:高楼扔鸡蛋](动态规划系列/高楼扔鸡蛋问题.md)
34+
* [经典动态规划问题:高楼扔鸡蛋(进阶)](动态规划系列/高楼扔鸡蛋进阶.md)
2435
* [动态规划之子序列问题解题模板](动态规划系列/子序列问题模板.md)
2536
* [动态规划之博弈问题](动态规划系列/动态规划之博弈问题.md)
37+
* [贪心算法之区间调度问题](动态规划系列/贪心算法之区间调度问题.md)
2638
* [动态规划之KMP字符匹配算法](动态规划系列/动态规划之KMP字符匹配算法.md)
2739
* [团灭 LeetCode 股票买卖问题](动态规划系列/团灭股票问题.md)
2840
* [团灭 LeetCode 打家劫舍问题](动态规划系列/抢房子.md)
29-
* [贪心算法之区间调度问题](动态规划系列/贪心算法之区间调度问题.md)
3041
* [动态规划之四键键盘](动态规划系列/动态规划之四键键盘.md)
3142
* [动态规划之正则表达](动态规划系列/动态规划之正则表达.md)
3243
* [最长公共子序列](动态规划系列/最长公共子序列.md)
33-
34-
3544
* 第二章、数据结构系列
3645
* [学习算法和刷题的思路指南](算法思维系列/学习数据结构和算法的高效方法.md)
37-
* [学习数据结构和算法看什么书](算法思维系列/为什么推荐算法4.md)
46+
* [学习数据结构和算法读什么书](算法思维系列/为什么推荐算法4.md)
3847
* [二叉堆详解实现优先级队列](数据结构系列/二叉堆详解实现优先级队列.md)
3948
* [LRU算法详解](高频面试系列/LRU算法.md)
4049
* [二叉搜索树操作集锦](数据结构系列/二叉搜索树操作集锦.md)
@@ -43,8 +52,6 @@
4352
* [设计Twitter](数据结构系列/设计Twitter.md)
4453
* [递归反转链表的一部分](数据结构系列/递归反转链表的一部分.md)
4554
* [队列实现栈\|栈实现队列](数据结构系列/队列实现栈栈实现队列.md)
46-
47-
4855
* 第三章、算法思维系列
4956
* [算法学习之路](算法思维系列/算法学习之路.md)
5057
* [回溯算法详解](算法思维系列/回溯算法详解修订版.md)
@@ -64,8 +71,6 @@
6471
* [几个反直觉的概率问题](算法思维系列/几个反直觉的概率问题.md)
6572
* [洗牌算法](算法思维系列/洗牌算法.md)
6673
* [递归详解](算法思维系列/递归详解.md)
67-
68-
6974
* 第四章、高频面试系列
7075
* [如何实现LRU算法](高频面试系列/LRU算法.md)
7176
* [如何高效寻找素数](高频面试系列/打印素数.md)
@@ -82,11 +87,14 @@
8287
* [如何调度考生的座位](高频面试系列/座位调度.md)
8388
* [Union-Find算法详解](算法思维系列/UnionFind算法详解.md)
8489
* [Union-Find算法应用](算法思维系列/UnionFind算法应用.md)
85-
* [什么是 session 和 cookie](技术/session和cookie.md)
86-
* [Linux的进程、线程、文件描述符是什么](技术/linux进程.md)
8790
* [一行代码就能解决的算法题](高频面试系列/一行代码解决的智力题.md)
88-
* [密码算法的前生今世](技术/密码技术.md)
8991
* [二分查找高效判定子序列](高频面试系列/二分查找判定子序列.md)
92+
* 第五章、计算机技术
93+
* [Linux的进程、线程、文件描述符是什么](技术/linux进程.md)
94+
* [一文看懂 session 和 cookie](技术/session和cookie.md)
95+
* [关于 Linux shell 你必须知道的](技术/linuxsell.md)
96+
* [加密算法的前身今世](技术/密码技术.md)
97+
* [Git/SQL/正则表达式的在线练习平台](技术/在线练习平台.md)
9098

9199
# Donate
92100

pictures/table.jpg

-675 KB
Binary file not shown.

pictures/tableqr.jpg

-869 KB
Binary file not shown.
Binary file not shown.
Binary file not shown.
-5.36 KB
Binary file not shown.

动态规划系列/动态规划之四键键盘.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -166,4 +166,8 @@ def dp(n, a_num, copy):
166166

167167
回顾第二种解法,我们稍加思考就能想到,最优的序列应该是这种形式:`A,A..C-A,C-C,C-V,C-V..C-A,C-C,C-V..`
168168

169-
根据这个事实,我们重新定义了状态,重新寻找了状态转移,从逻辑上减少了无效的子问题个数,从而提高了算法的效率。
169+
根据这个事实,我们重新定义了状态,重新寻找了状态转移,从逻辑上减少了无效的子问题个数,从而提高了算法的效率。
170+
171+
坚持原创高质量文章,致力于把算法问题讲清楚,欢迎关注我的公众号 labuladong 获取最新文章:
172+
173+
![labuladong](../pictures/labuladong.jpg)

动态规划系列/动态规划设计:最长递增子序列.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -180,4 +180,8 @@ public int lengthOfLIS(int[] nums) {
180180

181181
这个解法确实很难想到。首先涉及数学证明,谁能想到按照这些规则执行,就能得到最长递增子序列呢?其次还有二分查找的运用,要是对二分查找的细节不清楚,给了思路也很难写对。
182182

183-
所以,这个方法作为思维拓展好了。但动态规划的设计方法应该完全理解:假设之前的答案已知,利用数学归纳的思想正确进行状态的推演转移,最终得到答案。
183+
所以,这个方法作为思维拓展好了。但动态规划的设计方法应该完全理解:假设之前的答案已知,利用数学归纳的思想正确进行状态的推演转移,最终得到答案。
184+
185+
坚持原创高质量文章,致力于把算法问题讲清楚,欢迎关注我的公众号 labuladong 获取最新文章:
186+
187+
![labuladong](../pictures/labuladong.jpg)

动态规划系列/抢房子.md

+5
Original file line numberDiff line numberDiff line change
@@ -224,3 +224,8 @@ int[] dp(TreeNode root) {
224224

225225
实际上,这个解法比我们的解法运行时间要快得多,虽然算法分析层面时间复杂度是相同的。原因在于此解法没有使用额外的备忘录,减少了数据操作的复杂性,所以实际运行效率会快。
226226

227+
228+
229+
坚持原创高质量文章,致力于把算法问题讲清楚,欢迎关注我的公众号 labuladong 获取最新文章:
230+
231+
![labuladong](../pictures/labuladong.jpg)

动态规划系列/最长公共子序列.md

+5
Original file line numberDiff line numberDiff line change
@@ -115,3 +115,8 @@ else:
115115

116116
找状态转移方程的方法是,思考每个状态有哪些「选择」,只要我们能用正确的逻辑做出正确的选择,算法就能够正确运行。
117117

118+
119+
120+
坚持原创高质量文章,致力于把算法问题讲清楚,欢迎关注我的公众号 labuladong 获取最新文章:
121+
122+
![labuladong](../pictures/labuladong.jpg)

动态规划系列/高楼扔鸡蛋进阶.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -261,4 +261,8 @@ while (lo < hi) {
261261

262262
简单总结一下吧,第一个二分优化是利用了 `dp` 函数的单调性,用二分查找技巧快速搜索答案;第二种优化是巧妙地修改了状态转移方程,简化了求解了流程,但相应的,解题逻辑比较难以想到;后续还可以用一些数学方法和二分搜索进一步优化第二种解法,不过看了看镜子中的发量,算了。
263263

264-
本文终,希望对你有一点启发。
264+
本文终,希望对你有一点启发。
265+
266+
坚持原创高质量文章,致力于把算法问题讲清楚,欢迎关注我的公众号 labuladong 获取最新文章:
267+
268+
![labuladong](../pictures/labuladong.jpg)

技术/linux进程.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -101,4 +101,8 @@ PS:不要忘了,Linux 中一切都被抽象成文件,设备也是文件,
101101
102102
当然,必须要说明的是,只有 Linux 系统将线程看做共享数据的进程,不对其做特殊看待,其他的很多操作系统是对线程和进程区别对待的,线程有其特有的数据结构,我个人认为不如 Linux 的这种设计简洁,增加了系统的复杂度。
103103
104-
在 Linux 中新建线程和进程的效率都是很高的,对于新建进程时内存区域拷贝的问题,Linux 采用了 copy-on-write 的策略优化,也就是并不真正复制父进程的内存空间,而是等到需要写操作时才去复制。**所以 Linux 中新建进程和新建线程都是很迅速的**。
104+
在 Linux 中新建线程和进程的效率都是很高的,对于新建进程时内存区域拷贝的问题,Linux 采用了 copy-on-write 的策略优化,也就是并不真正复制父进程的内存空间,而是等到需要写操作时才去复制。**所以 Linux 中新建进程和新建线程都是很迅速的**。
105+
106+
坚持原创高质量文章,致力于把算法问题讲清楚,欢迎关注我的公众号 labuladong 获取最新文章:
107+
108+
![labuladong](../pictures/labuladong.jpg)

技术/redis入侵.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,8 @@ Redis 监听的默认端口是 6379,我们设置它接收网卡 127.0.0.1 的
7676

7777
2、配置服务器防火墙和 Redis 的 config 文件,尽量不要让 Redis 与外界接触。
7878

79-
3、利用 rename 功能伪装 flushall 这种危险命令,以防被删库,丢失数据。
79+
3、利用 rename 功能伪装 flushall 这种危险命令,以防被删库,丢失数据。
80+
81+
坚持原创高质量文章,致力于把算法问题讲清楚,欢迎关注我的公众号 labuladong 获取最新文章:
82+
83+
![labuladong](../pictures/labuladong.jpg)

技术/session和cookie.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -125,4 +125,8 @@ type Provider interface {
125125

126126
https://github.com/alexedwards/scs
127127

128-
https://github.com/astaxie/build-web-application-with-golang
128+
https://github.com/astaxie/build-web-application-with-golang
129+
130+
坚持原创高质量文章,致力于把算法问题讲清楚,欢迎关注我的公众号 labuladong 获取最新文章:
131+
132+
![labuladong](../pictures/labuladong.jpg)

技术/在线练习平台.md

+5
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,8 @@ SQLZOO 是一款很好用的 SQL 练习平台,英文不难理解,可以直
8989
网站地址:
9090

9191
https://sqlzoo.net/
92+
93+
94+
坚持原创高质量文章,致力于把算法问题讲清楚,欢迎关注我的公众号 labuladong 获取最新文章:
95+
96+
![labuladong](../pictures/labuladong.jpg)

技术/密码技术.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -172,4 +172,8 @@ RSA 算法作为经典的非对称加密算法,有两种用途:如果用于
172172

173173
HTTPS 协议中的 SSL/TLS 安全层会组合使用以上几种加密方式,**所以说不要安装非正规的浏览器,不要乱安装未知来源的证书**
174174

175-
密码技术只是安全的一小部分,即便是通过正规机构认证的 HTTPS 站点,也不意味着可信任,只能说明其数据传输是安全的。技术永远不可能真正保护你,最重要的还是得提高个人的安全防范意识,多留心眼儿,谨慎处理敏感数据。
175+
密码技术只是安全的一小部分,即便是通过正规机构认证的 HTTPS 站点,也不意味着可信任,只能说明其数据传输是安全的。技术永远不可能真正保护你,最重要的还是得提高个人的安全防范意识,多留心眼儿,谨慎处理敏感数据。
176+
177+
坚持原创高质量文章,致力于把算法问题讲清楚,欢迎关注我的公众号 labuladong 获取最新文章:
178+
179+
![labuladong](../pictures/labuladong.jpg)

数据结构系列/二叉搜索树操作集锦.md

+5
Original file line numberDiff line numberDiff line change
@@ -270,3 +270,8 @@ void BST(TreeNode root, int target) {
270270

271271
4. 掌握了 BST 的基本操作。
272272

273+
274+
275+
坚持原创高质量文章,致力于把算法问题讲清楚,欢迎关注我的公众号 labuladong 获取最新文章:
276+
277+
![labuladong](../pictures/labuladong.jpg)

数据结构系列/单调队列.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -178,4 +178,8 @@ vector<int> maxSlidingWindow(vector<int>& nums, int k) {
178178

179179
单调队列在添加元素的时候靠删除元素保持队列的单调性,相当于抽取出某个函数中单调递增(或递减)的部分;而优先级队列(二叉堆)相当于自动排序,差别大了去了。
180180

181-
赶紧去拿下 LeetCode 第 239 道题吧~
181+
赶紧去拿下 LeetCode 第 239 道题吧~
182+
183+
坚持原创高质量文章,致力于把算法问题讲清楚,欢迎关注我的公众号 labuladong 获取最新文章:
184+
185+
![labuladong](../pictures/labuladong.jpg)

数据结构系列/设计Twitter.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -270,4 +270,8 @@ public List<Integer> getNewsFeed(int userId) {
270270

271271
最后,Github 上有一个优秀的开源项目,专门收集了很多大型系统设计的案例和解析,而且有中文版本,上面这个图也出自该项目。对系统设计感兴趣的读者可以点击「阅读原文」查看。
272272

273-
PS:本文前两张图片和 GIF 是我第一次尝试用平板的绘图软件制作的,花了很多时间,尤其是 GIF 图,需要一帧一帧制作。如果本文内容对你有帮助,点个赞分个享,鼓励一下我呗!
273+
PS:本文前两张图片和 GIF 是我第一次尝试用平板的绘图软件制作的,花了很多时间,尤其是 GIF 图,需要一帧一帧制作。如果本文内容对你有帮助,点个赞分个享,鼓励一下我呗!
274+
275+
坚持原创高质量文章,致力于把算法问题讲清楚,欢迎关注我的公众号 labuladong 获取最新文章:
276+
277+
![labuladong](../pictures/labuladong.jpg)

数据结构系列/递归反转链表的一部分.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -186,4 +186,8 @@ ListNode reverseBetween(ListNode head, int m, int n) {
186186

187187
处理看起来比较困难的问题,可以尝试化整为零,把一些简单的解法进行修改,解决困难的问题。
188188

189-
值得一提的是,递归操作链表并不高效。和迭代解法相比,虽然时间复杂度都是 O(N),但是迭代解法的空间复杂度是 O(1),而递归解法需要堆栈,空间复杂度是 O(N)。所以递归操作链表可以作为对递归算法的练习或者拿去和小伙伴装逼,但是考虑效率的话还是使用迭代算法更好。
189+
值得一提的是,递归操作链表并不高效。和迭代解法相比,虽然时间复杂度都是 O(N),但是迭代解法的空间复杂度是 O(1),而递归解法需要堆栈,空间复杂度是 O(N)。所以递归操作链表可以作为对递归算法的练习或者拿去和小伙伴装逼,但是考虑效率的话还是使用迭代算法更好。
190+
191+
坚持原创高质量文章,致力于把算法问题讲清楚,欢迎关注我的公众号 labuladong 获取最新文章:
192+
193+
![labuladong](../pictures/labuladong.jpg)

数据结构系列/队列实现栈栈实现队列.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -196,4 +196,8 @@ public boolean empty() {
196196

197197
从栈 `s1` 搬运元素到 `s2` 之后,元素在 `s2` 中就变成了队列的先进先出顺序,这个特性有点类似「负负得正」,确实不太容易想到。
198198

199-
希望本文对你有帮助。
199+
希望本文对你有帮助。
200+
201+
坚持原创高质量文章,致力于把算法问题讲清楚,欢迎关注我的公众号 labuladong 获取最新文章:
202+
203+
![labuladong](../pictures/labuladong.jpg)

算法思维系列/FloodFill算法详解及应用.md

+5
Original file line numberDiff line numberDiff line change
@@ -214,3 +214,8 @@ int fill(int[][] image, int x, int y,
214214

215215

216216

217+
218+
219+
坚持原创高质量文章,致力于把算法问题讲清楚,欢迎关注我的公众号 labuladong 获取最新文章:
220+
221+
![labuladong](../pictures/labuladong.jpg)

算法思维系列/UnionFind算法应用.md

+5
Original file line numberDiff line numberDiff line change
@@ -216,3 +216,8 @@ boolean equationsPossible(String[] equations) {
216216

217217
很多更复杂的 DFS 算法问题,都可以利用 Union-Find 算法更漂亮的解决。LeetCode 上 Union-Find 相关的问题也就二十多道,有兴趣的读者可以去做一做。
218218

219+
220+
221+
坚持原创高质量文章,致力于把算法问题讲清楚,欢迎关注我的公众号 labuladong 获取最新文章:
222+
223+
![labuladong](../pictures/labuladong.jpg)

算法思维系列/twoSum问题的核心思想.md

+5
Original file line numberDiff line numberDiff line change
@@ -151,3 +151,8 @@ int[] twoSum(int[] nums, int target) {
151151
}
152152
```
153153

154+
155+
156+
坚持原创高质量文章,致力于把算法问题讲清楚,欢迎关注我的公众号 labuladong 获取最新文章:
157+
158+
![labuladong](../pictures/labuladong.jpg)

算法思维系列/信封嵌套问题.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -103,4 +103,8 @@ public int lengthOfLIS(int[] nums) {
103103

104104
实际上,这个思路是错误的。这类问题叫做「偏序问题」,上升到三维会使难度巨幅提升,需要借助一种高级数据结构「树状数组」,有兴趣的读者可以自行搜索。
105105

106-
有很多算法问题都需要排序后进行处理,阿东正在进行整理总结。希望本文对你有帮助。
106+
有很多算法问题都需要排序后进行处理,阿东正在进行整理总结。希望本文对你有帮助。
107+
108+
坚持原创高质量文章,致力于把算法问题讲清楚,欢迎关注我的公众号 labuladong 获取最新文章:
109+
110+
![labuladong](../pictures/labuladong.jpg)

算法思维系列/几个反直觉的概率问题.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -112,4 +112,8 @@ $P(两次能中奖) = P(第一次就中了) + P(第一次没中但第二次中
112112

113113
因为按照刚才「浓缩」概率这个思想,只要进行了排除,都是在进行「浓缩」,均摊下来肯定比你一开始蒙的那个答案概率 1/4 高。比如刚才的例子,C 和 D 的正确概率都是 3/8,而你开始蒙的 A 只有 1/4。
114114

115-
当然,运用此策略蒙题的前提是你真的抓瞎,真的随机乱选答案,这样概率才能作为最后的杀手锏。
115+
当然,运用此策略蒙题的前提是你真的抓瞎,真的随机乱选答案,这样概率才能作为最后的杀手锏。
116+
117+
坚持原创高质量文章,致力于把算法问题讲清楚,欢迎关注我的公众号 labuladong 获取最新文章:
118+
119+
![labuladong](../pictures/labuladong.jpg)

算法思维系列/前缀和技巧.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -127,4 +127,8 @@ for (int i = 1; i < count.length; i++)
127127

128128
但是,稍微复杂一些的算法问题,不止考察简单的前缀和技巧。比如本文探讨的这道题目,就需要借助前缀和的思路做进一步的优化,借助哈希表去除不必要的嵌套循环。可见对题目的理解和细节的分析能力对于算法的优化是至关重要的。
129129

130-
希望本文对你有帮助。
130+
希望本文对你有帮助。
131+
132+
坚持原创高质量文章,致力于把算法问题讲清楚,欢迎关注我的公众号 labuladong 获取最新文章:
133+
134+
![labuladong](../pictures/labuladong.jpg)

算法思维系列/区间交集问题.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -101,4 +101,8 @@ def intervalIntersection(A, B):
101101

102102
总结一下,区间类问题看起来都比较复杂,情况很多难以处理,但实际上通过观察各种不同情况之间的共性可以发现规律,用简洁的代码就能处理。
103103

104-
另外,区间问题没啥特别厉害的奇技淫巧,其操作也朴实无华,但其应用却十分广泛,接之前的几篇文章:
104+
另外,区间问题没啥特别厉害的奇技淫巧,其操作也朴实无华,但其应用却十分广泛,接之前的几篇文章:
105+
106+
坚持原创高质量文章,致力于把算法问题讲清楚,欢迎关注我的公众号 labuladong 获取最新文章:
107+
108+
![labuladong](../pictures/labuladong.jpg)

算法思维系列/区间调度问题之区间合并.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,8 @@ def merge(intervals):
5959

6060
至此,区间合并问题就解决了。本文篇幅短小,因为区间合并只是区间问题的一个类型,后续还有一些区间问题。本想把所有问题类型都总结在一篇文章,但有读者反应,长文只会收藏不会看... 所以还是分成小短文吧,读者有什么看法可以在留言板留言交流。
6161

62-
本文终,希望对你有帮助。
62+
本文终,希望对你有帮助。
63+
64+
坚持原创高质量文章,致力于把算法问题讲清楚,欢迎关注我的公众号 labuladong 获取最新文章:
65+
66+
![labuladong](../pictures/labuladong.jpg)

0 commit comments

Comments
 (0)