力扣27 移除元素
题目:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
数组理论基础:
数组(Array)是有序的元素序列。
1 | 2 | 3 | 4 | 5 |
删除元素3后,真实并非
1 | 2 | 4 | 5 |
而是
1 | 2 | 4 | 5 |
库函数使用:erase 时间复杂度O(n)
暴力实现:时间O(n2) 空间O(1)
class Solution {
public int removeElement(int[] nums, int val) {
int length=nums.length;
for(int i=0;i<length;i++){
if(nums[i]==val){
for(int j=i+1;j<length;j++){
nums[j-1]=nums[j];//往前覆盖
}
i--;
length--;//数组大小减1
}
}
return length;
}
}
双指针实现:时间O(n) 空间O(1)
快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
慢指针:指向新数组下标的位置
fast | ||||||
0 | 1 | 3 | 2 | 3 | 4 | 5 |
slow |
(1) f=0, nums[f]=nums[0]!=3 --> nums[s]=nums[0]=0, s-->1
(2) f=1, nums[f]=nums[1]!=3 --> nums[s]=nums[1]=1, s-->2
(3) f=2, nums[f]=nums[2]=3
(4) f=3, nums[f]=nums[3]!=3 --> nums[s]=nums[2]=nums[f]=2, s-->3
(5) f=4, nums[f]=nums[4]=3
(6) f=5, nums[f]=nums[5]!=3 --> nums[s]=nums[3]=nums[f]=4, s-->4
(7) f=6, nums[f]=nums[6]!=3 --> nums[s]=nums[4]=nums[f]=5, s-->5
(8) f=7,出循环,返回数组大小=slow=5
可以想象成:slow是个碗边,fast是个铲子,fast往前推土的时候,发现3的时候就铲掉,然后把其他土往碗里扔,slow就是那个碗的边,一直保持一个位子给下一堆土。
class Solution {
public int removeElement(int[] nums, int val) {
int slow=0;
for(int fast=0;fast<nums.length;fast++){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY