(第16天)双指针法题型总结

数组篇

数组结构基础

  • 数组可以存储多个相同类型元素。
  • 数组在内存空间中的地址是连续的。
  • 数组使用下标来访问元素,下标从[0]开始。

基于结构的推导

  • 数组的元素不能移除,只能覆盖。
  • 数组要添加一个值,必须把之后的值都相应往后移动一位。

题目

  1. 移除元素:暴力解法需要遍历数组找到符合要求的元素还需要将元素逐个移动,时间复杂度为O(n2)。双指针法使用两个个指针遍历数组赋值,将时间复杂度降低为O(n)。

字符串篇

字符串结构基础

  • C语言里的字符串是字符数组,C++里新增了string类。
  • 使用下标来访问元素,下标从[0]开始

题目

  1. 翻转字符串:使用两个指针指向要交换的元素进行交换,实现翻转功能。这里使用双指针法来实现功能。
  2. 替换数字:使用双指针指向字符串的不同位置,一边遍历字符串,一边进行覆盖操作。这道题有暴力做法时间复杂度O(n2),也有O(n),但又一个缺点是需要用到额外空间。双指针法时间复杂度为O(n2),同时不适用额外空间。
  3. 翻转字符串里的单词:使用双指针法搜索非空格字符覆盖原来位置,达到去除空格的效果。双指针法分别指向要交换的元素,实现翻转功能。在用双指针法实现功能的同时,也降低了时间复杂度。

链表篇

链表结构基础

  • 链表的基本结构是节点,每个节点包含数据域和指针域,节点之间通过指针域中的指针连接。
  • 数据域:存储数据;指针域:存储下一个节点的内存地址。
  • 链表是散乱分布在内存中的,通过指针访问链表中的节点数据。

题目

  1. 翻转链表:改变链表节点的next指针的指向就可以实现翻转链表。定义两个指针,一个指向前一个节点,一个指向当前节点,开始进行原地翻转。这里双指针法解决这个问题是原地翻转,没有使用额外空间,空间复杂度为O(1)。
  2. 环形链表II:先通过数学推理得出解法。然后定义双指针参与到判断语句中解决问题。

N数之和篇

题目

  1. 三数之和:使用双指针法,将原本暴力法O(n3)降为O(n2);比起哈希法相同量级的时间复杂度高效一些。
  2. 四数之和:双指针法将原本暴力O(n4)的解法,降为O(n3)的解法。

总结

双指针法有很多作用。

  1. 在有些题中用于解决问题。例如:链表中相关题目。
  2. 在有些题中用于降低时间复杂度。
  3. 在有些题中可以降低空间复杂度。
  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值