力扣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;
}
}

浙公网安备 33010602011771号