双指针巧解复写零问题
复写零问题解析
问题描述
给定一个固定长度的数组,将所有出现的零复制一次,其余元素向右移动,超出数组长度的部分舍弃。例如:
输入 [1,0,2,3,0,4,5,0],输出 [1,0,0,2,3,0,0,4]。
双指针法原理
核心思想
通过快慢指针模拟元素复写过程:
- 快指针遍历原数组,标记需要复写的零。
- 慢指针指向新数组的当前位置,决定是否插入复写的零。
边界条件
- 数组末尾的零无需复写(因长度限制)。
- 复写零可能导致原数据被覆盖,需从后向前处理。
实现步骤
预处理:计算有效长度
遍历数组统计零的个数,确定最终有效元素的位置:
n = len(arr)
zeros = arr.count(0)
size = n + zeros
逆向填充
从有效长度的末尾开始填充数据,遇到零则复写:
i = n - 1 # 原数组指针
j = size - 1 # 新数组指针
while i >= 0 and j >= 0:
if arr[i] != 0:
if j < n:
arr[j] = arr[i]
j -= 1
else:
if j < n:
arr[j] = 0
j -= 1
if j < n:
arr[j] = 0
j -= 1
i -= 1
复杂度分析
- 时间复杂度:O(n),仅需两次线性遍历。
- 空间复杂度:O(1),原地修改数组,无额外空间消耗。
示例代码
完整Python实现:
def duplicateZeros(arr):
n = len(arr)
zeros = arr.count(0)
size = n + zeros
i, j = n - 1, size - 1
while i >= 0 and j >= 0:
if arr[i] != 0:
if j < n:
arr[j] = arr[i]
j -= 1
else:
if j < n:
arr[j] = 0
j -= 1
if j < n:
arr[j] = 0
j -= 1
i -= 1
关键点总结
- 逆向操作:避免正向复写导致数据覆盖丢失。
- 双指针协作:快指针定位数据,慢指针控制写入位置。
- 边界检查:确保写入时不越界,舍弃超出部分。
BbS.okacop050.info/PoSt/1120_844020.HtM
BbS.okacop051.info/PoSt/1120_306027.HtM
BbS.okacop052.info/PoSt/1120_405377.HtM
BbS.okacop053.info/PoSt/1120_044409.HtM
BbS.okacop054.info/PoSt/1120_138519.HtM
BbS.okacop055.info/PoSt/1120_143192.HtM
BbS.okacop056.info/PoSt/1120_325225.HtM
BbS.okacop057.info/PoSt/1120_557010.HtM
BbS.okacop058.info/PoSt/1120_084947.HtM
BbS.okacop059.info/PoSt/1120_394255.HtM
BbS.okacop060.info/PoSt/1120_968494.HtM
BbS.okacop061.info/PoSt/1120_807257.HtM
BbS.okacop062.info/PoSt/1120_755131.HtM
BbS.okacop063.info/PoSt/1120_254530.HtM
BbS.okacop065.info/PoSt/1120_771986.HtM
BbS.okacop066.info/PoSt/1120_219968.HtM
BbS.okacop067.info/PoSt/1120_451465.HtM
BbS.okacop068.info/PoSt/1120_163341.HtM
BbS.okacop069.info/PoSt/1120_687779.HtM
BbS.okacop070.info/PoSt/1120_679961.HtM
BbS.okacop060.info/PoSt/1120_912524.HtM
BbS.okacop061.info/PoSt/1120_443992.HtM
BbS.okacop062.info/PoSt/1120_267750.HtM
BbS.okacop063.info/PoSt/1120_156402.HtM
BbS.okacop065.info/PoSt/1120_500486.HtM
BbS.okacop066.info/PoSt/1120_283840.HtM
BbS.okacop067.info/PoSt/1120_226728.HtM
BbS.okacop068.info/PoSt/1120_769808.HtM
BbS.okacop069.info/PoSt/1120_077658.HtM
BbS.okacop070.info/PoSt/1120_542873.HtM
BbS.okacop060.info/PoSt/1120_337825.HtM
BbS.okacop061.info/PoSt/1120_809114.HtM
BbS.okacop062.info/PoSt/1120_189697.HtM
BbS.okacop063.info/PoSt/1120_996146.HtM
BbS.okacop065.info/PoSt/1120_453752.HtM
BbS.okacop066.info/PoSt/1120_732945.HtM
BbS.okacop067.info/PoSt/1120_150182.HtM
BbS.okacop068.info/PoSt/1120_013288.HtM
BbS.okacop069.info/PoSt/1120_486075.HtM
BbS.okacop070.info/PoSt/1120_791453.HtM
BbS.okacop060.info/PoSt/1120_225631.HtM
BbS.okacop061.info/PoSt/1120_691569.HtM
BbS.okacop062.info/PoSt/1120_723859.HtM
BbS.okacop063.info/PoSt/1120_364787.HtM
BbS.okacop065.info/PoSt/1120_199904.HtM
BbS.okacop066.info/PoSt/1120_665343.HtM
BbS.okacop067.info/PoSt/1120_747220.HtM
BbS.okacop068.info/PoSt/1120_442692.HtM
BbS.okacop069.info/PoSt/1120_112953.HtM
BbS.okacop070.info/PoSt/1120_003684.HtM
BbS.okacop060.info/PoSt/1120_151270.HtM
BbS.okacop061.info/PoSt/1120_952103.HtM
BbS.okacop062.info/PoSt/1120_216845.HtM
BbS.okacop063.info/PoSt/1120_385023.HtM
BbS.okacop065.info/PoSt/1120_962848.HtM
BbS.okacop066.info/PoSt/1120_951029.HtM
BbS.okacop067.info/PoSt/1120_124467.HtM
BbS.okacop068.info/PoSt/1120_263303.HtM
BbS.okacop069.info/PoSt/1120_129621.HtM
BbS.okacop070.info/PoSt/1120_186214.HtM
BbS.okacop060.info/PoSt/1120_711922.HtM
BbS.okacop061.info/PoSt/1120_969891.HtM
BbS.okacop062.info/PoSt/1120_263825.HtM
BbS.okacop063.info/PoSt/1120_221095.HtM
BbS.okacop065.info/PoSt/1120_828839.HtM
BbS.okacop066.info/PoSt/1120_163644.HtM
BbS.okacop067.info/PoSt/1120_021557.HtM
BbS.okacop068.info/PoSt/1120_057562.HtM
BbS.okacop069.info/PoSt/1120_514937.HtM
BbS.okacop070.info/PoSt/1120_497865.HtM
BbS.okacop060.info/PoSt/1120_321310.HtM
BbS.okacop061.info/PoSt/1120_554756.HtM
BbS.okacop062.info/PoSt/1120_089771.HtM
BbS.okacop063.info/PoSt/1120_368854.HtM
BbS.okacop065.info/PoSt/1120_729694.HtM
BbS.okacop066.info/PoSt/1120_546929.HtM
BbS.okacop067.info/PoSt/1120_881458.HtM
BbS.okacop068.info/PoSt/1120_330360.HtM
BbS.okacop069.info/PoSt/1120_679667.HtM
BbS.okacop070.info/PoSt/1120_012436.HtM
