当前位置: 首页 > news >正文

第三十五天:移除元素

移除元素:原地操作的双指针技巧

在处理数组相关题目时,"原地修改"是一个关键要求——这意味着我们必须在原数组上直接操作,而不能使用额外存储空间。

一、题目

给定一个数组 nums 和一个目标值 val,需要原地移除所有等于 val 的元素,然后返回“与 val 不同的元素的数量 k”。

额外要求:

  • 数组的前 k 个元素必须是“不等于 val 的有效元素”(顺序可改变)。
  • 无需关心数组中 k 之后的元素。

二、核心思路:双指针(快慢指针)

我们可以用两个“逻辑角色”的指针来完成操作:

  • 慢指针 k:表示「下一个要放置**有效元素(不等于 val)**的位置」,同时也记录「当前已保留的有效元素个数」。
  • 快指针 i:遍历整个数组,寻找「不等于 val 的元素」。

三、代码实现

class Solution {
public:int removeElement(vector<int>& nums, int val) {int k = 0; // 慢指针:记录有效元素个数 + 下一个有效元素的放置位置for (int i = 0; i < nums.size(); ++i) {if (nums[i] != val) { // 遇到有效元素(不等于 val)nums[k] = nums[i]; // 放到数组的前 k 位k++; // 有效元素数量 +1,更新下一个放置位置}}return k; // 返回有效元素的数量}
};

四、代码解析

  1. 初始化:设置 k = 0,表示当前有效元素个数为 0,下一个有效元素应放置在索引 0 的位置。
  2. 遍历数组:使用快指针 i 从数组首元素开始遍历。
  3. 元素处理
    • nums[i] != val(遇到有效元素):
      • nums[i] 赋值到 nums[k] 位置(维护有效元素的前 k 位)
      • 递增 k(有效元素计数增加,同时更新下一个存放位置)
    • nums[i] == val(遇到待移除元素):跳过处理,保持 k 不变
  4. 结果返回:最终 k 值即为数组中不等于 val 的元素数量,且数组前 k 个元素即为所有有效元素。

五、示例验证

以示例 1 为例,详细说明移除元素的过程:

输入数组:nums = [3,2,2,3],需要移除的值 val = 3

完整遍历过程如下:

  1. 初始化阶段:

    • 设定慢指针 k = 0 (表示有效元素的位置)
    • 快指针 i 从 0 开始遍历整个数组
  2. 遍历过程:

    • 第一轮循环 (i=0):

      • 检查 nums[0] = 3
      • 与目标值 val=3 相等 → 需要移除
      • 保持 k=0,不进行赋值操作
      • 当前数组状态:[3,2,2,3](未改变)
    • 第二轮循环 (i=1):

      • 检查 nums[1] = 2
      • 与目标值不相等 → 需要保留
      • nums[1] 的值赋给 nums[k](即 nums[0] = 2
      • 递增 k=1
      • 数组变为:[2,2,2,3]
    • 第三轮循环 (i=2):

      • 检查 nums[2] = 2
      • 与目标值不相等 → 需要保留
      • nums[2] 的值赋给 nums[k](即 nums[1] = 2
      • 递增 k=2
      • 数组变为:[2,2,2,3]
    • 第四轮循环 (i=3):

      • 检查 nums[3] = 3
      • 与目标值相等 → 需要移除
      • 保持 k=2,不进行赋值操作
      • 数组保持:[2,2,2,3]
  3. 最终结果:

    • 返回的有效元素个数 k = 2
    • 数组前 2 个元素为 [2,2]
    • 虽然数组后面还有元素,但根据题目要求,只需保证前 k 个元素正确即可

这个示例展示了如何通过双指针(快慢指针)在原地修改数组,同时保持其他元素的相对顺序。注意最终数组的后两个元素 [2,3] 虽然还存在,但不在有效范围内,可以忽略。

六、复杂度分析

  • 时间复杂度O(n)O(n)O(n)。仅需单次遍历数组,其中 n 表示数组长度。
  • 空间复杂度O(1)O(1)O(1)。仅使用固定数量的变量(ki),无需额外存储空间,实现真正的原地操作。
http://www.dtcms.com/a/407753.html

相关文章:

  • 上海网站怎么备案网站开发 注意事项
  • mysql字符串截取,如何在MySQL备份文件中安全截取敏感字符串?
  • RAG技术与应用—基础
  • 英语学习-Saints018
  • 阿里巴巴上面可以做网站wordpress淘客采集
  • 深度学习入门:从神经网络基础到模型训练优化
  • 衡水做网站建设还有那个网站可以做兼职呢
  • 机器人控制:SDO和PDO在实际应用中如何配置和使用?
  • 免费做网站公司内容营销的形式有哪些
  • 【杀鸡焉用牛刀?】基于模板匹配的极简OCR实现
  • 合肥网站建设培训班wordpress采集规则
  • Spring Cloud Gateway 环境属性修改漏洞复现 (CVE-2025-41243)
  • 自然语言编程如何重塑软件开发教育?新人学习路径的辩证思考
  • 金华网站建设公司哪个好12389举报网站建设项目
  • 动态代理与反射
  • VUE 和 jquery 对比总结
  • 免费自学编程的app网站seo诊断的主要内容
  • Modbus TCP转RS485智能网关应用实例:集成工业测温器至云平台的数据采集方案
  • 需求模糊:架构复杂度背后的“隐藏杀手”
  • ARM芯片架构之CoreSight SoC-400组件详解
  • 做名片最好的网站是哪个wordpress订阅功能
  • 免费有限公司网站做环卫车怎么做网站
  • 网站设网页设计郑州外贸网站建站
  • 【数据结构】解锁数据结构:通往高效编程的密钥
  • 2、网关统一认证 + 服务内部鉴权
  • 买程序的网站进入京东商城
  • 开发中的英语积累 P5:Dump、Constraint、Hierarchy、Optimization、Measure、Attribute
  • 如何建设网站知乎网站淘宝客 没备案怎么做
  • 网络技术工程师宁波seo优化报价多少
  • php网站建设个人总结智慧团建官网登录口入口