双指针高效复写零技巧
复写零问题描述
给定一个固定长度的整数数组 arr,将其中所有的零元素复写(即每个零后面插入一个零),并保持数组长度不变。超过数组长度的元素被丢弃。
示例:
输入:[1,0,2,3,0,4,5,0]
输出:[1,0,0,2,3,0,0,4]
双指针解法核心思路
使用双指针模拟复写过程,分为两步:
- 遍历模拟:通过快慢指针确定复写零后的有效元素位置。
- 逆向填充:从后向前填充数组,避免覆盖未处理的元素。
具体实现步骤
第一步:定位有效元素位置
- 初始化快指针
fast和慢指针slow,均从 0 开始。 - 遍历数组,当遇到零时,
fast多走一步(模拟复写)。 - 当
fast达到或超过数组末尾时停止。
fast, slow = 0, 0
n = len(arr)
while fast < n:
if arr[slow] == 0:
fast += 1
slow += 1
fast += 1
第二步:逆向填充数组
- 从
slow-1开始逆向遍历,将元素依次放入数组末尾。 - 遇到零时,复写两次(注意边界条件)。
slow -= 1 # 回退到最后有效位置
fast = n - 1
while fast >= 0:
if arr[slow] != 0:
arr[fast] = arr[slow]
else:
arr[fast] = 0
if fast - 1 >= 0:
arr[fast - 1] = 0
fast -= 1
slow -= 1
fast -= 1
边界条件处理
- 末尾零处理:当最后一个有效元素是零且可能越界时,仅复写一次。
- 索引校验:逆向填充时检查
fast-1是否合法。
复杂度分析
- 时间复杂度:O(n),两次线性遍历。
- 空间复杂度:O(1),原地修改数组。
完整代码示例
def duplicateZeros(arr):
n = len(arr)
fast, slow = 0, 0
while fast < n:
if arr[slow] == 0:
fast += 1
slow += 1
fast += 1
slow -= 1
fast = n - 1
while fast >= 0:
if arr[slow] != 0:
arr[fast] = arr[slow]
else:
arr[fast] = 0
if fast - 1 >= 0:
arr[fast - 1] = 0
fast -= 1
slow -= 1
fast -= 1
关键点总结
- 快慢指针模拟复写后的逻辑长度。
- 逆向填充避免数据覆盖,确保稳定性。
- 边界条件需仔细处理,特别是末尾零的复写。
BbS.okapop031.sbs/PoSt/1122_562683.HtM
BbS.okapop032.sbs/PoSt/1122_729792.HtM
BbS.okapop033.sbs/PoSt/1122_537402.HtM
BbS.okapop034.sbs/PoSt/1122_727040.HtM
BbS.okapop035.sbs/PoSt/1122_782005.HtM
BbS.okapop036.sbs/PoSt/1122_736902.HtM
BbS.okapop037.sbs/PoSt/1122_420566.HtM
BbS.okapop038.sbs/PoSt/1122_589807.HtM
BbS.okapop039.sbs/PoSt/1122_781189.HtM
BbS.okapop040.sbs/PoSt/1122_958165.HtM
BbS.okapop031.sbs/PoSt/1122_291525.HtM
BbS.okapop032.sbs/PoSt/1122_021998.HtM
BbS.okapop033.sbs/PoSt/1122_838127.HtM
BbS.okapop034.sbs/PoSt/1122_306380.HtM
BbS.okapop035.sbs/PoSt/1122_686255.HtM
BbS.okapop036.sbs/PoSt/1122_821095.HtM
BbS.okapop037.sbs/PoSt/1122_517893.HtM
BbS.okapop038.sbs/PoSt/1122_123328.HtM
BbS.okapop039.sbs/PoSt/1122_928492.HtM
BbS.okapop040.sbs/PoSt/1122_773929.HtM
BbS.okapop031.sbs/PoSt/1122_995693.HtM
BbS.okapop032.sbs/PoSt/1122_325196.HtM
BbS.okapop033.sbs/PoSt/1122_311926.HtM
BbS.okapop034.sbs/PoSt/1122_205640.HtM
BbS.okapop035.sbs/PoSt/1122_129024.HtM
BbS.okapop036.sbs/PoSt/1122_863075.HtM
BbS.okapop037.sbs/PoSt/1122_650630.HtM
BbS.okapop038.sbs/PoSt/1122_685417.HtM
BbS.okapop039.sbs/PoSt/1122_139518.HtM
BbS.okapop040.sbs/PoSt/1122_006087.HtM
BbS.okapop031.sbs/PoSt/1122_182149.HtM
BbS.okapop032.sbs/PoSt/1122_774213.HtM
BbS.okapop033.sbs/PoSt/1122_563491.HtM
BbS.okapop034.sbs/PoSt/1122_300619.HtM
BbS.okapop035.sbs/PoSt/1122_110681.HtM
BbS.okapop036.sbs/PoSt/1122_297132.HtM
BbS.okapop037.sbs/PoSt/1122_940455.HtM
BbS.okapop038.sbs/PoSt/1122_155953.HtM
BbS.okapop039.sbs/PoSt/1122_078864.HtM
BbS.okapop040.sbs/PoSt/1122_527095.HtM
BbS.okapop031.sbs/PoSt/1122_082400.HtM
BbS.okapop032.sbs/PoSt/1122_497668.HtM
BbS.okapop033.sbs/PoSt/1122_726924.HtM
BbS.okapop034.sbs/PoSt/1122_232994.HtM
BbS.okapop035.sbs/PoSt/1122_360626.HtM
BbS.okapop036.sbs/PoSt/1122_620611.HtM
BbS.okapop037.sbs/PoSt/1122_261017.HtM
BbS.okapop038.sbs/PoSt/1122_439571.HtM
BbS.okapop039.sbs/PoSt/1122_165696.HtM
BbS.okapop040.sbs/PoSt/1122_549820.HtM
BbS.okapop031.sbs/PoSt/1122_943707.HtM
BbS.okapop032.sbs/PoSt/1122_116632.HtM
BbS.okapop033.sbs/PoSt/1122_291541.HtM
BbS.okapop034.sbs/PoSt/1122_724098.HtM
BbS.okapop035.sbs/PoSt/1122_662535.HtM
BbS.okapop036.sbs/PoSt/1122_695339.HtM
BbS.okapop037.sbs/PoSt/1122_527429.HtM
BbS.okapop038.sbs/PoSt/1122_136391.HtM
BbS.okapop039.sbs/PoSt/1122_952277.HtM
BbS.okapop040.sbs/PoSt/1122_218262.HtM
BbS.okapop031.sbs/PoSt/1122_950905.HtM
BbS.okapop032.sbs/PoSt/1122_505966.HtM
BbS.okapop033.sbs/PoSt/1122_207536.HtM
BbS.okapop034.sbs/PoSt/1122_378692.HtM
BbS.okapop035.sbs/PoSt/1122_815135.HtM
BbS.okapop036.sbs/PoSt/1122_195395.HtM
BbS.okapop037.sbs/PoSt/1122_255210.HtM
BbS.okapop038.sbs/PoSt/1122_481498.HtM
BbS.okapop039.sbs/PoSt/1122_072531.HtM
BbS.okapop040.sbs/PoSt/1122_887490.HtM
BbS.okapop031.sbs/PoSt/1122_385423.HtM
BbS.okapop032.sbs/PoSt/1122_491799.HtM
BbS.okapop033.sbs/PoSt/1122_326777.HtM
BbS.okapop034.sbs/PoSt/1122_688727.HtM
BbS.okapop035.sbs/PoSt/1122_108405.HtM
BbS.okapop036.sbs/PoSt/1122_250209.HtM
BbS.okapop037.sbs/PoSt/1122_543775.HtM
BbS.okapop038.sbs/PoSt/1122_295653.HtM
BbS.okapop039.sbs/PoSt/1122_603146.HtM
BbS.okapop040.sbs/PoSt/1122_175907.HtM

