双指针法高效解决「移除元素」问题

双指针法高效解决「移除元素」问题


双指针法高效解决「移除元素」问题

一、问题描述

给定一个整数数组 nums 和一个整数 val,我们需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。要求:

  • 必须原地修改输入数组
  • 不需要考虑数组中超出新长度后面的元素
  • 空间复杂度应为 O(1)

二、解法解析:双指针法

1. 核心思想

采用首尾双指针策略:

  • left 指针从数组头部开始,负责构建新数组
  • right 指针从数组尾部开始,提供替换元素

2. 算法步骤

java 复制代码
public int removeElement(int[] nums, int val) {
    int left = 0, right = nums.length - 1;  // 初始化双指针
    while (left <= right) {  // 循环条件
        if (nums[left] == val) {  // 发现目标值
            nums[left] = nums[right];  // 用末尾元素覆盖
            right--;  // 右指针左移
        } else {
            left++;  // 非目标值,左指针右移
        }
    }
    return left;  // left即为新长度
}

3. 执行过程示例

以 nums = [3,2,2,3], val = 3 为例:

  1. 初始状态:[3,2,2,3], left=0, right=3
  2. nums0==3 → 替换为nums3 → [3,2,2,3], right=2
  3. nums0==3 → 替换为nums2 → [2,2,2,3], right=1
  4. nums0==2 → left=1
  5. nums1==2 → left=2
  6. left>right 循环结束
  7. 返回 left=2,新数组为 [2,2,...]

三、关键点分析

  1. 边界条件 :while (left <= right) 确保处理所有元素
  2. 元素交换:发现目标值时直接覆盖而非交换,减少操作
  3. 指针移动 :
    • 只有确认当前元素不是目标值时才移动左指针
    • 每次覆盖操作后右指针必定左移

四、复杂度分析

指标 值 说明
时间复杂度 O(n) 最多遍历数组一次
空间复杂度 O(1) 只使用了常数级别的额外空间

五、与其他解法的比较

1. 快慢指针法

java 复制代码
int slow = 0;
for (int fast = 0; fast < nums.length; fast++) {
    if (nums[fast] != val) {
        nums[slow++] = nums[fast];
    }
}
return slow;
  • 更适合目标值较少的情况
  • 元素移动次数可能更多

2. 本解法的优势

  • 在目标值较多时效率更高
  • 每个目标值只需一次赋值操作
  • 保留了数组末端的原有元素

六、实际应用场景

这种双指针技巧适用于:

  1. 需要原地修改数组的问题
  2. 需要保持部分元素顺序的问题
  3. 资源受限环境下的数组操作

七、总结

这种首尾双指针解法:

  1. 是处理数组原地修改的高效方法
  2. 通过巧妙地指针移动减少不必要的操作
  3. 体现了算法设计中空间换时间的思想
  4. 需要熟练掌握指针边界条件的控制
相关推荐
葫三生39 分钟前
关于三生原理系列被技术开发社区批量收录或引发策展边界讨论的一种思考
大数据·人工智能·深度学习·算法·机器学习·数据挖掘·开源
catcatuncle39 分钟前
OpenWorkBuddy 部署排错手册:从源码启动到自己搭一个给团队用,七个最容易卡住的地方
算法
avi911141 分钟前
【AI教人】在Inspector显示所有Delegate-Odin Inspector之三
java·前端·算法·delegate·inspector·editor扩展·unity editor
淡海水1 小时前
06-02-源码-增量标记算法实现
算法·unity·c#·gc
碧海银沙音频科技研究院1 小时前
实现炬芯ATS308X的usb cdc 串口IAP 固件升级功能实现
人工智能·嵌入式硬件·深度学习·算法
云淡风轻~窗明几净1 小时前
角谷猜想与百度AI的对话dialog(原始稿)
人工智能·算法·机器学习·图论
小O的算法实验室2 小时前
ASOC,分层分数阶粒子群算法+无人机电场路径规划
算法
傅科摆 _ py2 小时前
链表力扣复习
数据结构·leetcode·链表
重生之小比特2 小时前
【算法拾光】二分查找|搜索插入位置 + x 的平方根
算法
智购科技自动售卖机厂家3 小时前
双摄像头方案F1-score只有0.85,排查发现是上下视角的融合逻辑写反了~YH
python·单片机·嵌入式硬件·算法·eclipse