双指针(Two Pointers)-后续会进行补充

双指针(Two Pointers)是编程中常用的一种技巧,通常用于遍历数组、链表等数据结构,以解决一些特定的问题,如查找重复元素、排序、反转链表等。双指针技巧的核心在于使用两个指针变量,以不同的速度或方向遍历数据结构,从而以更高效的方式找到所需的结果

根据双指针定义,可划分三类

                快慢双指针
                左右双指针
                滑动窗口

常见应用场景

以下是一些双指针技巧的常见应用场景:

  1. 查找重复元素:在有序数组中查找重复元素时,可以使用双指针。一个指针从头开始,另一个指针从尾开始。如果两个指针指向的元素相等,则说明找到了重复元素;如果前一个元素小于后一个元素,则前一个指针向后移动;如果前一个元素大于后一个元素,则后一个指针向前移动。
  2. 快慢指针:快慢指针是一种特殊的双指针技巧,其中一个指针(快指针)每次移动两个位置,而另一个指针(慢指针)每次只移动一个位置。这种技巧常用于检测链表中的环、找到链表的中间节点等。
  3. 反转链表:在链表中,可以使用双指针技巧来反转链表。一个指针指向当前节点,另一个指针指向下一个节点。通过改变当前节点的 next 指针的指向,可以实现链表的反转。
  4. 滑动窗口:滑动窗口技巧常用于解决一些需要在固定大小的窗口内进行计算的问题,如计算滑动窗口内的最大值、最小值等。可以使用双指针来维护这个窗口的边界,并通过移动指针来更新窗口内的元素。
  5. 合并两个有序链表:当有两个有序链表时,可以使用双指针技巧将它们合并为一个有序链表。一个指针指向第一个链表的头节点,另一个指针指向第二个链表的头节点。比较两个指针所指向的节点的值,将较小的节点添加到新链表中,并将该指针向后移动一位。重复这个过程,直到其中一个链表遍历完为止。然后将另一个链表剩余的部分直接添加到新链表的末尾。

需要注意的是,在使用双指针技巧时,要确保指针的初始位置、移动方向和移动步长是合理的,以避免出现越界、死循环等问题。同时,也要注意处理一些特殊情况,如链表为空、数组长度为0等。

 双指针算法的思路和方法

  1. 快慢指针
    • 快慢指针通过以不同速度移动的两个指针来解决链表或数组中的问题。通常用于判断链表中是否存在环或者寻找链表的中点。例如,在一个排序数组中找到没有重复元素的子数组的最大长度,可以使用快慢指针来找到无重复元素的边界。
    • 在具体实现上,例如在判断链表中是否有环的问题中,可以初始化两个指针,一个快指针每次移动两个节点,慢指针每次移动一个节点。如果链表中存在环,则快指针最终会追上慢指针;如果不存在环,快指针会达到链表末尾。这种思路可以将时间复杂度降低到O(n)。
  2. 对撞指针
    • 对撞指针从数组的两端开始,向中间逐步逼近。这种方法常用于有序数组或字符串问题。例如,判断一个字符串是否是回文串,可以通过设置左右指针逐步向中间移动,比较指针指向的字符是否相等。
    • 对于反转字符串中的元音字母问题,可以设置两个指针,分别从字符串的开头和结尾向中间扫描。每当两个指针都指向元音字母时,交换这两个字母的位置,直到左右指针相遇或交叉。这种方法可以在O(n)的时间复杂度内解决问题。
  3. 滑动窗口
    • 滑动窗口算法使用两个指针标识当前处理的子数组的起始和结束位置。这种技术常用于解决数组中的子序列问题,比如寻找数组中的最长递增子序列。
    • 以盛最多水的容器为例,给定一个直方图高度数组,找到由其构成的容器中能装最多水的宽度为两指针间的距离。通过不断移动两个指针并计算当前的水量,可以找到最大水量。

综上所述,双指针算法通过巧妙地使用指针移动策略,可以在O(n)的时间复杂度内解决许多复杂的问题。快慢指针适用于链表问题,对撞指针适合解决字符串和数组问题,而滑动窗口则用于处理数组中的连续子序列问题。这些方法共同特点是高效利用了空间和时间资源,是提高算法效率的有力工具

假设一个一维数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值