LeetCode官方题解:https://leetcode-cn.com/problems/remove-element/solution/yi-chu-yuan-su-by-leetcode/
目录
一、需求
A:给定一个数组nums和值val,原地移除数组中所有等于val的元素,返回移除后数组新长度;
B:不能使用额外空间,空间复杂度为O(1);
C:无须考虑数组中超过新长度后面的元素;
二、双指针方法一
-
思路分析
A:和上一篇原地删除重复元素的原理类似,通过设置两个辅助变量i,j;
B:通过j来遍历数组,目的是找到与val不相等的值;
C:通过i来将与val不等的值保存到数组中;
-
代码实现
class Solution {
public int removeElement(int[] nums, int val) {
int i = 0;
for(int j=0;j<nums.length;j++) {
if(nums[j]!=val) {
nums[i++] = nums[j];
}
}
return i;
}
}
-
复杂度分析
A:时间复杂度为O(n);
B:空间复杂度为O(1);
三、双指针方法二
-
算法分析
A:若数组是[1,2,3,5,4]或者[4,1,2,3,5]这样的,val=4,此时数组中要删除的数比较少;
B:若采用双指针方法一,会有很多没必要的复制;
C:所以,首先设置一个辅助变量i来遍历数组,得到每一个数组值;
D:然后,遍历数组依次与val进行比较
a:相等的话,就把这个待删除的和数组最后的元素交换位置;
b:不再考虑最后这个元素,即数组长度-1;
c:不相等的话,继续比较;
E:最后返回新数组长度;
-
代码实现
class Solution {
public int removeElement(int[] nums, int val) {
int n = nums.length;
int i = 0;
while(i<n) {
if(nums[i]==val) {
nums[i]=nums[n-1];
n--;
} else {
i++;
}
}
return n;
}
}
-
复杂度分析
A:时间复杂度为O(n);
B:空间复杂度为O(1);