双指针

双指针算法是一种常见的算法设计模式,它利用两个指针在数组或序列中移动来解决特定的问题。这种算法通常用于解决那些需要在序列上进行搜索或比较的问题,特别是在排序数组或连续元素上的问题。双指针技术可以有效地减少时间复杂度,因为它避免了不必要的重复计算。 双指针算法的应用非常广泛,以下是一些常见的使用场景:

  1. 移动窗口问题:这类问题通常涉及到在数组中找到一个满足特定条件的连续子数组。比如,给定一个数组和一个目标和,需要找到一个长度最小的子数组,其和至少为这个目标值。
  2. 排序数组中的两数之和问题:给定一个已排序的数组和一个目标值,需要找到数组中两个数的和等于目标值,且这两个数的索引之间的距离最小。
  3. 链表问题:在链表中找到两个节点,使得它们之间的距离最小或满足其他特定条件。
  4. 滑动窗口问题:在给定的滑动窗口中,找到满足特定条件的子数组或子字符串。
  5. 合并两个有序数组问题:将两个有序数组合并为一个有序数组,通常通过两个指针分别从两个数组的开始位置向外扩展。
  6. 数组中的逆序对问题:在一个数组中找到所有逆序对的数量,即满足 i < j 但 nums[i] > nums[j] 的对 (i, j) 的数量。

双指针算法的关键思想是利用两个指针的相对位置来探索和解决问题。这两个指针可以是同向移动的(都向右或都向左,快慢指针),也可以是反向移动的(一个向左,一个向右,对撞指针)。通过调整这两个指针的移动速度和方向,可以有效地处理各种问题。 在实际应用中,双指针算法的具体实现会根据问题的不同而有所差异,但其核心思想是相似的,即通过指针的相对位置和移动来简化问题和提高效率。

验证回文串

判断子序列

两数之和II - 输入有序数组

盛最多水的容器

三数之和