代码随想录刷题Day12

79 阅读2分钟

双指针复盘

  • 数组篇
  1. 27. 移除元素

通过两个指针在一个for循环下完成两个for循环的工作。

  • 字符串篇
  1. 344. 反转字符串
  2. LCR 122. 路径加密
  3. 151. 反转字符串中的单词

反转字符串,注意这里强调要原地反转,要不然就失去了题目的意义。使用双指针法,定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。 时间复杂度是O(n)。

替换空格中介绍使用双指针填充字符串的方法,如果想把这道题目做到极致,就不要只用额外的辅助空间了! 思路就是首先扩充数组到每个空格替换成"%20"之后的大小。然后双指针从后向前替换空格。 从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。

使用双指针法,用O(n)的时间复杂度完成字符串删除类的操作,因为题目要删除冗余空格。在删除冗余空格的过程中,如果不注意代码效率,很容易写成了O(n^2)的时间复杂度。其实使用双指针法O(n)就可以搞定。

  • 链表篇
  1. 206. 反转链表
  2. 19. 删除链表的倒数第 N 个结点
  3. 面试题 02.07. 链表相交
  4. 142. 环形链表 II

使用双指针法来翻转链表,只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表。

在链表中求环,使用快慢指针(双指针法),分别定义 fast 和 slow指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。

  • N数之和篇
  1. 15. 三数之和
  2. 18. 四数之和

三数之和通过前后两个指针不算向中间逼近,在一个for循环下完成两个for循环的工作。

四数之和,其实思路是一样的,在三数之和的基础上再套一层for循环,依然是使用双指针法。