算法入门:专题攻克主题一---双指针(1)移动零 复写零。

双指针算法基础:移动零与复写零问题解析

双指针算法是解决数组和链表问题的有效工具,尤其适用于需要在原数据结构上进行修改的场景。移动零和复写零是两个经典的双指针应用问题,通过这两个案例可以深入理解快慢指针的协作机制。

移动零问题

移动零要求将数组中的所有零元素移动到末尾,同时保持非零元素的相对顺序。例如,输入 [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](假设数组长度可变)。

关键步骤

  1. 计算复写后的数组长度
  2. 从后向前遍历,避免覆盖未处理元素

代码实现

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](假设数组长度可变)。

关键步骤

  1. 计算复写后的数组长度
  2. 从后向前遍历,避免覆盖未处理元素

代码实现

def duplicateZeros(arr):
    possible_dups = 0
    length = len(arr) - 1
    
    # 计算需要复写的零数量
    for left
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值