当前位置: 首页 > 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.dtcms.com/a/273304.html

相关文章:

  • 多元函数的链式法则:从单变量到高维的推广
  • 无人设备遥控器之无线电频率篇
  • Java HashMap已存在的值是否覆盖
  • 全链智造铸丰碑 全球布局启新程 —— 河北华创测控技术有限公司领航测控产业新高度
  • python学习打卡:DAY 29 复习日:类的装饰器
  • 快捷键——VsCode
  • msf复现“永恒之蓝”
  • 在 node 端执行打开一个新的 chrome 并且跳转到指定 url
  • 力扣热门算法题 136.只出现一次的数字,139.单词拆分,141.环形链表
  • Docker——容器文件操作
  • 实习第一个小需求样式问题总结
  • 八猴渲染器三维场景实时预览软件 Marmoset Toolbag 5.02b1 Win
  • 20250710-day11
  • 如何选择合适的ai降重工具?七个实用的ai查重网站
  • MyBatis插件机制揭秘:从拦截器开发到分页插件实战
  • 「莫尔物理新范式」普林斯顿马普所合作Nature论文:SnSe₂/ZrS₂扭曲双层实现M点能谷调控与拓扑新效应
  • 安装VMware详细步骤
  • 基于模糊控制及BP神经网络开关磁阻电机的matlab仿真
  • Python-函数进阶
  • 国内如何考取Oracle大师
  • F-GNN的新型检测框架:随机森林增强图神经网络
  • JDK动态代理:深入解析Java动态代理的核心实现
  • qwen3、gemma3 GPRO强化训练案例
  • spring-ai agent概念
  • 6.4 BL2到BL31/BL33的切换
  • Android 13----在framworks层映射一个物理按键
  • C++并发编程-12. 用内存顺序实现内存模型
  • 写《XX顶层设计》和《XX可研报告》区别。
  • MySQL索引:数据库的超级目录
  • 网站文章更新慢影响排名?AI批量写文章技巧分享