题干
代码: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;
}
};
@ 代码随想录