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