<aside> 🪬
双指针(Two Pointers):指的是在遍历元素的过程中,不是使用单个指针进行访问,而是使用两个指针进行访问,从而达到相应的目的。如果两个指针方向相反,则称为「对撞指针」。如果两个指针方向相同,则称为「快慢指针」。如果两个指针分别属于不同的数组 / 链表,则称为「分离双指针」。
</aside>
在数组的区间问题上,暴力算法的时间复杂度往往是 O(n2)。而双指针利用了区间「单调性」的性质,可以将时间复杂度降到 O(n)。
<aside> 🪬
对撞指针:指的是两个指针 left、right分别指向序列第一个元素和最后一个元素,然后left 指针不断递增,right不断递减,直到两个指针的值相撞,或者满足其他要求的特殊条件为止。
</aside>
<aside> 🪬
left, right = 0, len(nums) - 1
while left < right: if 满足要求的特殊条件: return 符合条件的值 elif 一定条件 1: left += 1 elif 一定条件 2: right -= 1
return 没找到 或 找到对应值
</aside>
对撞指针一般用来解决有序数组或者字符串问题:
描述:给定一个下标从 11 开始计数、升序排列的整数数组:numbers 和一个目标值 target。
要求:从数组中找出满足相加之和等于 target 的两个数,并返回两个数在数组中下的标值。
示例:
<aside> 🪬
输入:numbers = [2,7,11,15], target = 9 输出:[1,2] 解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
</aside>