12
12
13
13
# 数组篇
14
14
15
- 在[ 数组:就移除个元素很难么?] ( https://mp.weixin.qq.com/s/wj0T-Xs88_FHJFwayElQlA ) 中,原地移除数组上的元素,我们说到了数组上的元素,不能真正的删除,只能覆盖。
15
+ 在[ 数组:就移除个元素很难么?] ( https://mp.weixin.qq.com/s/RMkulE4NIb6XsSX83ra-Ww ) 中,原地移除数组上的元素,我们说到了数组上的元素,不能真正的删除,只能覆盖。
16
16
17
17
一些同学可能会写出如下代码(伪代码):
18
18
@@ -30,11 +30,11 @@ for (int i = 0; i < array.size(); i++) {
30
30
31
31
# 字符串篇
32
32
33
- 在[ 字符串:这道题目,使用库函数一行代码搞定] ( https://mp.weixin.qq.com/s/X02S61WCYiCEhaik6VUpFA ) 中讲解了反转字符串,注意这里强调要原地反转,要不然就失去了题目的意义。
33
+ 在[ 字符串:这道题目,使用库函数一行代码搞定] ( https://mp.weixin.qq.com/s/_rNm66OJVl92gBDIbGpA3w ) 中讲解了反转字符串,注意这里强调要原地反转,要不然就失去了题目的意义。
34
34
35
35
使用双指针法,** 定义两个指针(也可以说是索引下表),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。** ,时间复杂度是O(n)。
36
36
37
- 在[ 替换空格] ( https://mp.weixin.qq.com/s/t0A9C44zgM-RysAQV3GZpg ) 中介绍使用双指针填充字符串的方法,如果想把这道题目做到极致,就不要只用额外的辅助空间了!
37
+ 在[ 替换空格] ( https://mp.weixin.qq.com/s/69HNjR4apcRSAo_KyknPjA ) 中介绍使用双指针填充字符串的方法,如果想把这道题目做到极致,就不要只用额外的辅助空间了!
38
38
39
39
思路就是** 首先扩充数组到每个空格替换成"%20"之后的大小。然后双指针从后向前替换空格。**
40
40
@@ -44,7 +44,7 @@ for (int i = 0; i < array.size(); i++) {
44
44
45
45
** 其实很多数组(字符串)填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。**
46
46
47
- 那么在[ 字符串:花式反转还不够!] ( https://mp.weixin.qq.com/s/X3qpi2v5RSp08mO-W5Vicw ) 中,我们使用双指针法,用O(n)的时间复杂度完成字符串删除类的操作,因为题目要产出冗余空格。
47
+ 那么在[ 字符串:花式反转还不够!] ( https://mp.weixin.qq.com/s/4j6vPFHkFAXnQhmSkq2X9g ) 中,我们使用双指针法,用O(n)的时间复杂度完成字符串删除类的操作,因为题目要产出冗余空格。
48
48
49
49
** 在删除冗余空格的过程中,如果不注意代码效率,很容易写成了O(n^2)的时间复杂度。其实使用双指针法O(n)就可以搞定。**
50
50
@@ -54,19 +54,19 @@ for (int i = 0; i < array.size(); i++) {
54
54
55
55
翻转链表是现场面试,白纸写代码的好题,考察了候选者对链表以及指针的熟悉程度,而且代码也不长,适合在白纸上写。
56
56
57
- 在[ 链表:听说过两天反转链表又写不出来了?] ( https://mp.weixin.qq.com/s/pnvVP-0ZM7epB8y3w_Njwg ) 中,讲如何使用双指针法来翻转链表,** 只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表。**
57
+ 在[ 链表:听说过两天反转链表又写不出来了?] ( https://mp.weixin.qq.com/s/ckEvIVGcNLfrz6OLOMoT0A ) 中,讲如何使用双指针法来翻转链表,** 只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表。**
58
58
59
59
思路还是很简单的,代码也不长,但是想在白纸上一次性写出bugfree的代码,并不是容易的事情。
60
60
61
- 在链表中求环,应该是双指针在链表里最经典的应用,在[ 链表:环找到了,那入口呢?] ( https://mp.weixin.qq.com/s/_QVP3IkRZWx9zIpQRgajzA ) 中讲解了如何通过双指针判断是否有环,而且还要找到环的入口。
61
+ 在链表中求环,应该是双指针在链表里最经典的应用,在[ 链表:环找到了,那入口呢?] ( https://mp.weixin.qq.com/s/gt_VH3hQTqNxyWcl1ECSbQ ) 中讲解了如何通过双指针判断是否有环,而且还要找到环的入口。
62
62
63
63
** 使用快慢指针(双指针法),分别定义 fast 和 slow指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。**
64
64
65
- 那么找到环的入口,其实需要点简单的数学推理,我在文章中把找环的入口清清楚楚的推理的一遍,如果对找环入口不够清楚的同学建议自己看一看[ 链表:环找到了,那入口呢?] ( https://mp.weixin.qq.com/s/_QVP3IkRZWx9zIpQRgajzA ) 。
65
+ 那么找到环的入口,其实需要点简单的数学推理,我在文章中把找环的入口清清楚楚的推理的一遍,如果对找环入口不够清楚的同学建议自己看一看[ 链表:环找到了,那入口呢?] ( https://mp.weixin.qq.com/s/gt_VH3hQTqNxyWcl1ECSbQ ) 。
66
66
67
67
# N数之和篇
68
68
69
- 在[ 哈希表:解决了两数之和,那么能解决三数之和么?] ( https://mp.weixin.qq.com/s/r5cgZFu0tv4grBAexdcd8A ) 中,讲到使用哈希法可以解决1.两数之和的问题
69
+ 在[ 哈希表:解决了两数之和,那么能解决三数之和么?] ( https://mp.weixin.qq.com/s/QfTNEByq1YlNSXRKEumwHg ) 中,讲到使用哈希法可以解决1.两数之和的问题
70
70
71
71
其实使用双指针也可以解决1.两数之和的问题,只不过1.两数之和求的是两个元素的下标,没法用双指针,如果改成求具体两个元素的数值就可以了,大家可以尝试用双指针做一个leetcode上两数之和的题目,就可以体会到我说的意思了。
72
72
@@ -82,7 +82,7 @@ for (int i = 0; i < array.size(); i++) {
82
82
83
83
只用双指针法时间复杂度为O(n^2),但比哈希法的O(n^2)效率高得多,哈希法在使用两层for循环的时候,能做的剪枝操作很有限。
84
84
85
- 在[ 双指针法:一样的道理,能解决四数之和] ( https://mp.weixin.qq.com/s/nQrcco8AZJV1pAOVjeIU_g ) 中,讲到了四数之和,其实思路是一样的,** 在三数之和的基础上再套一层for循环,依然是使用双指针法。**
85
+ 在[ 双指针法:一样的道理,能解决四数之和] ( https://mp.weixin.qq.com/s/SBU3THi1Kv6Sar7htqCB2Q ) 中,讲到了四数之和,其实思路是一样的,** 在三数之和的基础上再套一层for循环,依然是使用双指针法。**
86
86
87
87
对于三数之和使用双指针法就是将原本暴力O(n^3)的解法,降为O(n^2)的解法,四数之和的双指针解法就是将原本暴力O(n^4)的解法,降为O(n^3)的解法。
88
88
@@ -94,18 +94,6 @@ for (int i = 0; i < array.size(); i++) {
94
94
本文中一共介绍了leetcode上九道使用双指针解决问题的经典题目,除了链表一些题目一定要使用双指针,其他题目都是使用双指针来提高效率,一般是将O(n^2)的时间复杂度,降为O(n)。
95
95
96
96
建议大家可以把文中涉及到的题目在好好做一做,琢磨琢磨,基本对双指针法就不在话下了。
97
- ## 其他语言版本
98
-
99
-
100
- Java:
101
-
102
-
103
- Python:
104
-
105
-
106
- Go:
107
-
108
-
109
97
110
98
111
99
-----------------------
0 commit comments