1. 双指针算法核心思想解析
双指针算法(Two Pointers Technique)是解决数组和链表问题的利器,其本质是通过维护两个或多个指针的协同移动来降低问题的时间复杂度。在实际编码面试中,约30%的中等难度题目可以通过双指针思路高效解决。根据指针移动方式的不同,主要分为三种经典模式:
快慢指针(Fast-Slow Pointers)通常用于检测循环或寻找中位数。快指针每次移动两步,慢指针每次移动一步,当快指针到达末尾时,慢指针正好位于中间位置。这种模式将遍历次数从O(n²)优化到O(n),空间复杂度保持O(1)。
对撞指针(Collision Pointers)适用于已排序数组的搜索问题。通过初始化左指针在起始位置、右指针在末尾,根据条件向中间移动指针,直到两者相遇。典型的应用场景包括两数之和、三数之和等问题,可将暴力解法的O(n³)优化到O(n²)。
滑动窗口(Sliding Window)是处理子数组/子字符串问题的有效方法。通过动态调整窗口的左右边界来寻找满足条件的区间,避免了重复计算。最大特点是右指针主动扩展窗口,左指针被动收缩窗口,时间复杂度通常为O(n)。
关键理解:双指针不是独立算法,而是一种通过指针协同来减少无效计算的优化思想。其威力在于将嵌套循环转化为单次遍历,同时保持空间效率。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. LeetCode 283 - 移动零的三种解法对比
题目要求将数组中的零元素移动到末尾,同时保持非零元素的相对顺序。表面简单,但隐藏着对空间复杂度的考察。
2.1 暴力解法与空间优化
最直观的方法是创建新数组,遍历原数组两次:第一次收集非零元素,第二次补零。这种方法需要O(n)额外空间,不符合题目要求的原地修改(in-place)。
python复制def moveZeroes_naive(nums):
non_zeros = [x for x in nums if x != 0]
return non_zeros + [0] * (len(nums) - len(non_zeros))
2.2 快慢指针标准解法
维护慢指针指向下一个非零元素的插入位置,快指针遍历数组。当快指针遇到非零元素时,将其与慢指针位置交换,然后双指针同时前进;遇到零时仅快指针前进。这种解法只需O(1)空
