双指针高效复写零技巧

复写零问题描述

给定一个固定长度的整数数组 arr,将其中所有的零元素复写(即每个零后面插入一个零),并保持数组长度不变。超过数组长度的元素被丢弃。

示例: 输入:[1,0,2,3,0,4,5,0]
输出:[1,0,0,2,3,0,0,4]

双指针解法核心思路

使用双指针模拟复写过程,分为两步:

  1. 遍历模拟:通过快慢指针确定复写零后的有效元素位置。
  2. 逆向填充:从后向前填充数组,避免覆盖未处理的元素。

具体实现步骤

第一步:定位有效元素位置

  • 初始化快指针 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

#牛客AI配图神器#

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务