题干
代码:vector的erase()函数
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
for(auto it=nums.begin();it!=nums.end();){
if(*it==val)
it=nums.erase(it); // 删除元素,返回值指向已删除元素的下一个位置
else ++it; // 指向下一个位置
}
return nums.size();
}
};

O(n2) 双重循环
// 时间复杂度:O(n^2)
// 空间复杂度:O(1)
class Solution {
public:
int removeElement(vector<int>& nums, int 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];
}
i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
size--; // 此时数组的大小-1
}
}
return size;
}
};
O(n)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int i=0; // 慢指针
for(int j=0;j<nums.size();j++){ // 快指针
if(nums[j]!=val){
nums[i]=nums[j];
i++;
}
}
return i;
}
};
@ 代码随想录

这篇博客探讨了三种不同的C++中删除vector元素的方法。第一种使用`erase()`函数,时间复杂度为O(n)。第二种方法是双重循环,效率较低,为O(n^2)。第三种方法同样是O(n),通过慢指针和快指针实现。文章对比了它们的时间和空间复杂度,并提供了实际代码示例。
1735

被折叠的 条评论
为什么被折叠?



