双指针算法基础:移动零与复写零问题解析
双指针算法是解决数组和链表问题的有效工具,尤其适用于需要在原数据结构上进行修改的场景。移动零和复写零是两个经典的双指针应用问题,通过这两个案例可以深入理解快慢指针的协作机制。
移动零问题
移动零要求将数组中的所有零元素移动到末尾,同时保持非零元素的相对顺序。例如,输入 [0,1,0,3,12] 应输出 [1,3,12,0,0]。
核心思路
使用快慢指针:
- 快指针(
fast)遍历数组,寻找非零元素 - 慢指针(
slow)标记下一个非零元素应放置的位置
当快指针遇到非零元素时,将其与慢指针位置交换,随后同步移动两个指针;若遇到零则只移动快指针。
代码实现
def moveZeroes(nums):
slow = 0
for fast in range(len(nums)):
if nums[fast] != 0:
nums[slow], nums[fast] = nums[fast], nums[slow]
slow += 1
复杂度分析
- 时间复杂度:O(n),只需一次线性遍历
- 空间复杂度:O(1),原地操作无需额外空间
复写零问题
复写零要求遇到零时复制一个零到下一位置,并右移后续元素。例如,输入 [1,0,2,3,0,4] 应输出 [1,0,0,2,3,0,0](假设数组长度可变)。
关键步骤
- 计算复写后的数组长度
- 从后向前遍历,避免覆盖未处理元素
代码实现
def duplicateZeros(arr):
possible_dups = 0
length = len(arr) - 1
# 计算需要复写的零数量
for left
### 双指针算法基础:移动零与复写零问题解析
双指针算法是解决数组和链表问题的有效工具,尤其适用于需要在原数据结构上进行修改的场景。移动零和复写零是两个经典的双指针应用问题,通过这两个案例可以深入理解快慢指针的协作机制。
#### 移动零问题
移动零要求将数组中的所有零元素移动到末尾,同时保持非零元素的相对顺序。例如,输入 `[0,1,0,3,12]` 应输出 `[1,3,12,0,0]`。
**核心思路**
使用快慢指针:
- 快指针(`fast`)遍历数组,寻找非零元素
- 慢指针(`slow`)标记下一个非零元素应放置的位置
当快指针遇到非零元素时,将其与慢指针位置交换,随后同步移动两个指针;若遇到零则只移动快指针。
**代码实现**
```python
def moveZeroes(nums):
slow = 0
for fast in range(len(nums)):
if nums[fast] != 0:
nums[slow], nums[fast] = nums[fast], nums[slow]
slow += 1
复杂度分析
- 时间复杂度:O(n),只需一次线性遍历
- 空间复杂度:O(1),原地操作无需额外空间
复写零问题
复写零要求遇到零时复制一个零到下一位置,并右移后续元素。例如,输入 [1,0,2,3,0,4] 应输出 [1,0,0,2,3,0,0](假设数组长度可变)。
关键步骤
- 计算复写后的数组长度
- 从后向前遍历,避免覆盖未处理元素
代码实现
def duplicateZeros(arr):
possible_dups = 0
length = len(arr) - 1
# 计算需要复写的零数量
for left

被折叠的 条评论
为什么被折叠?



