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

【面试算法笔记】0102-数组-移除元素 相关

个人主页:https://github.com/zbhgis

前言

本系列主要记录自己学习算法的过程中的感悟。

力扣27.移除元素

链接:https://leetcode.cn/problems/remove-element/description/

注意点

快慢指针做法。

这道题的题目关键在于如何原地操作数组。

1.设计两个指针,一快一慢。

2.当快指针移动至需要保留元素的位置,就将nums[slow]赋值为nums[fast],同时slow跟着fast继续前进。这样子就能保证slow操作之后,能保留需要的元素。

3.当快指针移动至需要移除元素的位置,就直接跳过进入下一次循环,此时slow还是停留原地,这样子就等于移除了元素。

4.总的来说就是分为保留元素和移除元素这两步,之后如果题目变成了保留元素,那么其实解法就类似

代码

class Solution { public int search(int[] nums, int target) { if (target < nums[0] || target > nums[nums.length - 1]) { return -1; } int left = 0; int right = nums.length - 1; while (left <= right) { int mid = left + (right - left) / 2; if (nums[mid] == target) { return mid; } else if (nums[mid] < target) { left = mid + 1; } else { right = mid - 1; } } return -1; } }

时空复杂度分析

fast指针得遍历完整个数组,所以时间复杂度为O(n)

直接在原始数组上修改,空间复杂度为O(1)

力扣26. 删除有序数组中的重复项

链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/description/

注意点

快慢指针做法。

这道题的题目关键在于如何原地操作数组。

1.设计两个指针,一快一慢。

2.与上一题类似,不过这一次需要判断是否与前面的元素重复,如果不重复就移动slow,并赋值nums[slow]为nums[fast],最后返回

3.总的来说就是也是通过指针来保留不重复的值。

代码

class Solution { public int removeDuplicates(int[] nums) { int slow = 0; for (int fast = 0; fast < nums.length; fast ++) { if(nums[fast] != nums[slow]) { slow ++; nums[slow] = nums[fast]; } } return slow + 1; } }

时空复杂度分析

同上

力扣283. 移动零

链接:https://leetcode.cn/problems/move-zeroes/description/

注意点

快慢指针做法。

这道题的题目关键在于如何原地操作数组。

1.设计两个指针,一快一慢。

2.与上一题类似,不过这一次需要判断是否为零,不为零的话,就交换nums[fast]和nums[slow],相当于把零一直往后边送。

代码

class Solution { public void moveZeroes(int[] nums) { int slow = 0; for (int fast = 0; fast < nums.length; fast ++) { if (nums[fast] != 0) { int tmp = nums[fast]; nums[fast] = nums[slow]; nums[slow ++] = tmp; } } } }

时空复杂度分析

同上

力扣844. 比较含退格的字符串

链接:https://leetcode.cn/problems/backspace-string-compare/description/

注意点

快慢指针做法。

这道题的题目关键在于如何原地操作数组。

1.设计两个指针,一快一慢。

2.在操作之前,先将字符串转为字符数组才能遍历。

3.与上一题类似,不过这一次fast没碰到退格字符的时候,需要将chars[fast]赋值给chars[slow],slow一起跟着fast移动。如果碰到退格字符,说明这个字符需要保留,就需要将slow回退一个,相当于删除了一个字符的操作。所以循环结束之后区间[0,slow]相当于实际的数组。

代码

class Solution { public boolean backspaceCompare(String s, String t) { return process(t).equals(process(s)); } private String process(String str) { int slow = 0; char[] chars = str.toCharArray(); for (int fast = 0; fast < chars.length; fast ++) { if (chars[fast] != '#') { chars[slow] = chars[fast]; slow ++; } else { slow = slow > 0 ? -- slow : 0; } } return new String(chars, 0, slow); } }

时空复杂度分析

同上

http://www.jsqmd.com/news/1164299/

相关文章:

  • 直接插入排序 vs C++ STL sort:5个维度实测性能与适用场景对比
  • 2026瓷砖胶哪个牌子好?岩板/大板瓷砖胶十大品牌榜单 - 栗子测评
  • 千问新人福利,8元通用立减券,附专属福利口令,千问新用户专属220372
  • Vue 2 到 Vue 3 的语法演进:从 Options API 到 Composition API 完全指南
  • MATROX Y7469-03 采集卡
  • iOS激活锁绕过终极指南:Applera1n让被锁iPhone重获新生
  • 宝珀中国官方售后服务中心|服务电话与网点地址权威信息通知(2026年7月更新) - 宝珀官方售后服务中心
  • 如何用HS2汉化补丁一键解锁Honey Select 2完整中文体验
  • Microsoft 365遭大规模密码喷射攻击,逾78个账户沦陷
  • 深入解析Unreal模块生命周期:从加载到关闭的完整指南
  • Vue 3 Composition API 实战:从 Options API 迁移的工程策略
  • EC 4+2:1 亚节点纠删码实战:3节点6盘配置,硬盘故障容忍数提升至2
  • 快手内容采集终极指南:一键获取无水印视频与高清图片的完整解决方案
  • 瓷砖胶怎么选?2026亿固对比德高/亿固对比马贝优缺点分析详解 - 栗子测评
  • Pixel/原生安卓 WiFi 感叹号修复:无需Root的2种ADB命令方案实测
  • 2026年7月11日成都市场上包钢产无缝钢管(8163-20#;外径42-630mm)批发价格 - 四川盛世钢联营销中心
  • 2026年7月最新重庆天梭官方售后服务热线与网点地址查询 - 天梭服务中心
  • 如何零基础解锁国家中小学智慧教育平台的电子课本?
  • pfSense Plus vs CE 版本对比:3 大核心差异与家庭/小型办公室选型指南
  • Claude Code本质解析:终端即工作台的AI工程实践
  • 温州找靠谱汽车改装贴膜店必看!鹿城新膜势正品保障一站式服务省心力 - 行业深度观察C
  • WSL2运行Hermes Agent的必要性与环境配置指南
  • llama-cpp-python深度解析:GGUF模型加载与CUDA加速实战
  • 情感AI技术解析:从情感计算到可灵Kling AI的工程实践
  • 2026年7月最新广州积家官方售后客服中心地址电话及服务网点分布 - 积家官方售后服务中心
  • 2026年下半年AI量化开发,先用可检查小流程起步
  • 2026二手180搅拌站厂家哪家好?聚焦设备品质与售后保障的综合实力推荐泰安恒首机械有限公司 - 栗子测评
  • Web 渗透测试:未授权与越权漏洞全流程挖掘思路
  • 2026年当下,如何选择一家可靠的仿古影壁墙生产商? - 品牌鉴赏官2026
  • 2026年赤峰经济纠纷律师避坑指南:5家务实靠谱律师推荐 - 本地品牌推荐