字符串总结
双指针法
- 344.反转字符串,我们使用双指针法实现了反转字符串的操作,双指针法在数组,链表和字符串中很常用。
-
- 替换数字,同样还是使用双指针法在时间复杂度O(n)的情况下完成替换空格。
- 很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。
- 数组删除操作的问题,其实在27.移除元素 中就已经提到了使用双指针法进行移除操作。
- 151.翻转字符串里的单词中我们使用O(n)的时间复杂度,完成了删除冗余空格。
反转系列
-
- 反转字符串II (opens new window)中,当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。
只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。
因为要找的也就是每2 * k 区间的起点,这样写程序会高效很多。
- 反转字符串II (opens new window)中,当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。
- 151.翻转字符串里的单词 (opens new window)中要求翻转字符串里的单词,这道题目可以说是综合考察了字符串的多种操作。通过 先整体反转再局部反转,实现了反转字符串里的单词。后来发现反转字符串还有一个用处,就是达到左旋的效果。卡码网55.右旋字符串中,我们通过先局部反转再整体反转达到了左旋的效果。
KMP(下次再看)
- 实现 strStr()
- 重复的子字符串
双指针总结
数组
-
- 移除元素中,原地移除数组上的元素,我们说到了数组上的元素,不能真正的删除,只能覆盖。通过两个指针在一个for循环下完成两个for循环的工作。
字符串
- 344.反转字符串强调要原地反转,使用双指针法,定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。时间复杂度是O(n)。
- 卡码网54. 替换数字思路就是首先扩充数组到每个空格替换成"%20"之后的大小。然后双指针从后向前替换空格。从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。其实很多数组(字符串)填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。
- 151.翻转字符串里的单词使用双指针法,用O(n)的时间复杂度完成字符串删除类的操作,因为题目要删除冗余空格。在删除冗余空格的过程中,如果不注意代码效率,很容易写成了O(n^2)的时间复杂度。其实使用双指针法O(n)就可以搞定。
链表篇
- 206.反转链表中,讲如何使用双指针法来翻转链表,只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表。
- 在链表中求环,应该是双指针在链表里最经典的应用,142.环形链表II中如何通过双指针判断是否有环,而且还要找到环的入口。使用快慢指针(双指针法),分别定义 fast 和 slow指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。
N数之和篇
- 使用哈希法可以解决1.两数之和的问题,其实使用双指针也可以解决1.两数之和的问题,只不过1.两数之和求的是两个元素的下标,没法用双指针,如果改成求具体两个元素的数值就可以了。使用了哈希法解决了两数之和,但是哈希法并不使用于三数之和!第15题. 三数之和通过前后两个指针不算向中间逼近,在一个for循环下完成两个for循环的工作。第18题. 四数之和,思路是一样的,在三数之和的基础上再套一层for循环,依然是使用双指针法。对于三数之和使用双指针法就是将原本暴力O(n3)的解法,降为O(n2)的解法,四数之和的双指针解法就是将原本暴力O(n4)的解法,降为O(n3)的解法。
同样的道理,五数之和,n数之和都是在这个基础上累加。
总结
共练习了leetcode上九道使用双指针解决问题的经典题目,除了链表一些题目一定要使用双指针,其他题目都是使用双指针来提高效率,一般是将O(n2)的时间复杂度,降为O(n)。