数组篇
数组结构基础
- 数组可以存储多个相同类型元素。
- 数组在内存空间中的地址是连续的。
- 数组使用下标来访问元素,下标从[0]开始。
基于结构的推导:
- 数组的元素不能移除,只能覆盖。
- 数组要添加一个值,必须把之后的值都相应往后移动一位。
题目
- 移除元素:暴力解法需要遍历数组找到符合要求的元素还需要将元素逐个移动,时间复杂度为O(n2)。双指针法使用两个个指针遍历数组赋值,将时间复杂度降低为O(n)。
字符串篇
字符串结构基础
- C语言里的字符串是字符数组,C++里新增了string类。
- 使用下标来访问元素,下标从[0]开始
题目
- 翻转字符串:使用两个指针指向要交换的元素进行交换,实现翻转功能。这里使用双指针法来实现功能。
- 替换数字:使用双指针指向字符串的不同位置,一边遍历字符串,一边进行覆盖操作。这道题有暴力做法时间复杂度O(n2),也有O(n),但又一个缺点是需要用到额外空间。双指针法时间复杂度为O(n2),同时不适用额外空间。
- 翻转字符串里的单词:使用双指针法搜索非空格字符覆盖原来位置,达到去除空格的效果。双指针法分别指向要交换的元素,实现翻转功能。在用双指针法实现功能的同时,也降低了时间复杂度。
链表篇
链表结构基础
- 链表的基本结构是节点,每个节点包含数据域和指针域,节点之间通过指针域中的指针连接。
- 数据域:存储数据;指针域:存储下一个节点的内存地址。
- 链表是散乱分布在内存中的,通过指针访问链表中的节点数据。
题目
- 翻转链表:改变链表节点的next指针的指向就可以实现翻转链表。定义两个指针,一个指向前一个节点,一个指向当前节点,开始进行原地翻转。这里双指针法解决这个问题是原地翻转,没有使用额外空间,空间复杂度为O(1)。
- 环形链表II:先通过数学推理得出解法。然后定义双指针参与到判断语句中解决问题。
N数之和篇
题目
总结
双指针法有很多作用。
- 在有些题中用于解决问题。例如:链表中相关题目。
- 在有些题中用于降低时间复杂度。
- 在有些题中可以降低空间复杂度。