力扣题目27:移除元素
数组元素删除其实就是将不需要的元素用其他元素进行覆盖。并不存在真正的删除操作,因为元素存储的空间是连续的。
解法一:暴力解法
采用暴力解法,进行两次遍历;第一次遍历寻找需要删除的元素,第二次遍历将后边元素前移,将要删除的元素进行覆盖操作。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
//暴力解法,两次遍历,第一次找val,第二次更新
int size = nums.size();
for(int i = 0; i<size; i++){
if(nums[i]==val){
for(int j = i+1; j<size; j++){
nums[j-1] = nums[j];
}
size--;
i--;
}
}
return size;
}
};
显然,暴力解法的时间复杂度为O(n^2)
解法二:快慢指针法
通过一个快指针和慢指针在一个for循环内完成暴力解法中两个for循环的工作。
移除元素的过程如上图所示。
快指针和慢指针其实都是指向同一个数组的;不过快指针指向的数组可以抽象的理解为当前需要操作的数组,而慢指针是满足要求的元素组成的数组,也就是当当前元素不是要删除的元素时,将该元素赋给慢指针所指的数组。当循环完成时,慢指针所指向的数组下标也就是新数组的大小。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
//快慢指针法
int slowP = 0;
for(int fastP = 0;fastP<nums.size();fastP++){
if(nums[fastP]!=val){
nums[slowP]=nums[fastP];
slowP++;
}
}
return slowP;
}
};