双指针算法

双指针算法是一种通过使用两个指针(索引或引用)在数据结构中有序移动来高效解决问题的技巧。它常用于数组、链表等线性结构的问题,能显著优化时间和空间复杂度。以下是其核心应用场景及使用方法:


核心应用场景

  1. 有序数组的两数之和
    • 左右指针从两端向中间移动,根据当前和调整指针位置。
  2. 合并有序数组/链表
    • 从后向前填充避免覆盖,或直接比较节点合并。
  3. 快慢指针检测链表环
    • 快指针每次走两步,慢指针走一步,相遇则有环。
  4. 滑动窗口(子数组/子串问题)
    • 维护窗口的左右边界,动态调整窗口大小以满足条件。
  5. 原地修改数组(去重、移除元素)
    • 慢指针标记有效位置,快指针遍历寻找新元素。

通用实现步骤

  1. 初始化指针
    • 根据问题类型设置左右指针初始位置(如头尾、同起点)。
  2. 确定移动条件
    • 根据当前指针指向元素的关系或问题约束,决定如何移动指针。
  3. 终止条件
    • 通常为指针越界(如左指针超过右指针)或达到目标状态。

经典代码示例

1. 有序数组的两数之和(左右指针)
python 复制代码
def two_sum(nums, target):
    left, right = 0, len(nums) - 1
    while left < right:
        current_sum = nums[left] + nums[right]
        if current_sum == target:
            return [left, right]
        elif current_sum < target:
            left += 1
        else:
            right -= 1
    return []
2. 合并有序数组(逆向双指针)
python 复制代码
def merge(nums1, m, nums2, n):
    p1, p2, p = m-1, n-1, m+n-1
    while p1 >= 0 and p2 >= 0:
        if nums1[p1] > nums2[p2]:
            nums1[p] = nums1[p1]
            p1 -= 1
        else:
            nums1[p] = nums2[p2]
            p2 -= 1
        p -= 1
    nums1[:p2+1] = nums2[:p2+1]  # 处理剩余元素
3. 移除有序数组重复项(快慢指针)
python 复制代码
def remove_duplicates(nums):
    if not nums:
        return 0
    slow = 0
    for fast in range(1, len(nums)):
        if nums[fast] != nums[slow]:
            slow += 1
            nums[slow] = nums[fast]
    return slow + 1

使用技巧

  1. 滑动窗口模板

    python 复制代码
    left = 0
    for right in range(len(nums)):
        # 更新窗口状态(如加入nums[right])
        while 窗口不满足条件:
            # 更新窗口状态(如移除nums[left])
            left += 1
        # 记录结果(如最大/最小窗口长度)
  2. 链表问题

    • 快慢指针找中点:快指针到末尾时,慢指针指向中点。
    • 判断环:快慢指针相遇则有环,相遇后从头步进找到环入口。

适用问题特征

  • 线性结构(数组、链表、字符串)。
  • 需要高效遍历或比较连续元素。
  • 暴力解法时间复杂度高(如O(n²)),双指针可优化到O(n)或O(n log n)。

通过合理选择指针移动策略,双指针能高效解决大量问题,是算法面试中的必备技巧。

相关推荐
何其有幸.5 分钟前
实验3-3 比较大小(PTA|C语言)
c语言·数据结构·算法
东阳马生架构1 小时前
Sentinel源码—8.限流算法和设计模式总结二
算法·设计模式·sentinel
老饼讲解-BP神经网络2 小时前
一篇入门之-评分卡变量分箱(卡方分箱、决策树分箱、KS分箱等)实操例子
算法·决策树·机器学习
何其有幸.2 小时前
实验6-3 使用函数求特殊a串数列和(PTA|C语言)
c语言·数据结构·算法
不会计算机的捞地2 小时前
【数据结构入门训练DAY-24】美国大选
数据结构·算法
明月看潮生2 小时前
青少年编程与数学 02-018 C++数据结构与算法 11课题、分治
c++·算法·青少年编程·编程与数学
Echo``3 小时前
2:QT联合HALCON编程—图像显示放大缩小
开发语言·c++·图像处理·qt·算法
.似水3 小时前
2025.4.22_C_可变参数列表
java·c语言·算法
Felven3 小时前
A. Ideal Generator
java·数据结构·算法
MoonBit月兔4 小时前
双周报Vol.70: 运算符重载语义变化、String API 改动、IDE Markdown 格式支持优化...多项更新升级!
ide·算法·哈希算法