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

算法练习5-原地移除数组中所有的元素

原地移除数组中所有的元素

在编程实践中,处理数组中的特定元素是一个常见的挑战。例如,在数据清洗、用户输入验证等场景中,我们经常需要从一个数组中移除特定值的元素。这篇文章将深入探讨如何高效地完成这项任务,并介绍两种不同的方法:双指针法和其优化版。

方法一:双指针法

概述  

双指针是一种有效的算法策略,适用于需要遍历或比较数组元素的任务。在这种情况下,它可以帮助我们在不使用额外空间的情况下(即原地)移除数组中所有等于给定值 val 的元素。

算法步骤  

1. 初始化两个指针:left 和 right。left 用于追踪下一个非 val 元素应该放置的位置,而 right 则遍历整个数组。  

2. 当 right 遍历到一个不等于 val 的元素时,将其复制到 left 所指向的位置,并同时移动 left 和 right。  

3. 如果遇到 val,则仅移动 right,从而跳过该元素。  

4. 最终,left 的值就是新数组的长度。

  class Solution {public int removeElement(int[] nums, int val) {int n = nums.length;int left = 0;for (int right = 0; right < n; right++) {if (nums[right] != val) {nums[left] = nums[right];left++;}}return left;}}

复杂度分析  

时间复杂度:O(n),其中 n 是数组的长度。每个元素最多被访问两次。  

空间复杂度:O(1),因为不需要额外的空间来存储结果。

方法二:双指针法优化版

概述  

在某些情况下,尤其是当目标值 val 在数组开头出现时,上述方法可能导致不必要的元素赋值操作。通过调整双指针的移动方式,可以减少这些不必要的操作。

算法步骤  

1. 初始化 left 指向数组起始位置,right 指向数组末尾。  

2. 当 left 遇到 val 时,用 right 指向的元素替换掉当前 left 的值,并将 right 左移一位。  

3. 如果 left 指向的不是 val,则直接移动 left。  

4. 过程持续直到 left 和 right 相遇。

  class Solution {public int removeElement(int[] nums, int val) {int left = 0;int right = nums.length;while (left < right) {if (nums[left] == val) {nums[left] = nums[right - 1];right--;} else {left++;}}return left;}}

复杂度分析  

时间复杂度:O(n),但减少了不必要的元素复制操作。  

空间复杂度:O(1),同样不需要额外的空间。

实际应用案例

考虑一个在线商店的产品列表,如果某个产品下架了(对应于我们的 val),我们需要从展示给用户的列表中移除这个产品。使用本文介绍的方法,我们可以高效地更新产品列表而不影响用户体验。

结论

通过双指针法及其优化版,我们能够有效地解决原地移除数组中指定元素的问题。虽然两种方法的时间复杂度相同,但优化版在某些情况下能提供更好的性能表现。 希望这篇博客能帮助你更好地理解并应用这些技术!

http://www.lryc.cn/news/583868.html

相关文章:

  • 龙迅#LT8619B适用于HDMI转LVDS/RGB,芯片支持视频图像处理,OSD功能.
  • MacOS 终端(Terminal)配置显示日期时间
  • 在Docker中运行macOS的超方便体验!
  • 基于深度学习的自动调制识别网络(持续更新)
  • 【PTA数据结构 | C语言版】顺序队列的3个操作
  • 在 Mac 上使用 Git 拉取项目:完整指南
  • 【macos用镜像站体验】Claude Code入门使用教程和常用命令
  • 029_构造器重载与默认构造器
  • 基于多模态感知的裂缝2D及3D检测方案
  • 【leetcode】2236. 判断根节点是否等于子节点之和
  • git fetch的使用
  • vue3 uniapp 使用ref更新值后子组件没有更新 ref reactive的区别?使用from from -item执行表单验证一直提示没有值
  • TCP 保活(KeepAlive)机制详解
  • STM32F103之ModBus\RS232\RS422\RS485
  • OpenCV 图像进阶处理:特征提取与车牌识别深度解析
  • 人工智能-基础篇-28-模型上下文协议--MCP请求示例(JSON格式,客户端代码,服务端代码等示例)
  • LabVIEW 波形图表横坐标显示当前日期
  • Eigen 几何模块深拆:Isometry3d vs Affine3d + 变换矩阵本质详解
  • GitHub信息收集
  • STM32单片机_3
  • GitHub敏感信息收集与防御指南
  • esp32在vscode中仿真调试
  • 学习笔记丨卷积神经网络(CNN):原理剖析与多领域Github应用
  • 魔法原子发布高动态双足人形机器人MagicBot Z1
  • 个人精品文章导航
  • 一文讲清楚React Hooks
  • 1.2.3_1 OSI参考模型
  • 英语笔记1.0
  • 【Linux手册】从接口到管理:Linux文件系统的核心操作指南
  • C++之string类的实现代码及其详解(下)