解法一:空间复杂度O(n)
使用额外的空间可以使思路变得简单,要做的就是从A里面逐一拷贝元素到aux里,其中跳过elem就行了。缺点就是提升了空间复杂度,还有到最后需要把aux
的值在重新赋值给A,这样时间复杂度也多了一倍到达了theta(2n),空间复杂度为O(n)
复制代码
int removeElement2(int A[], int n, int elem) {
int len = n;
int aux[n];
int k = 0;
for (int i = 0; i < n; i++) {
if (A[i] == elem) {
len--;
}
else {
aux[k++] = A[i];
}
}
for (int i = 0; i < len; i++) {
A[i] = aux[i];
}
return len;
}
复制代码
解法二:认真观察删除操作的性质会发现,删除一个元素不过就是把他后面的元素向前移动一位,那删除两个不就是移动两位,三个就是三位。。。以此类推。
所以我们只用在遍历数组的时候跟踪删除的个数n,然后同时将元素向后挪动n位就可以了,就这么简单。
复制代码
int removeElement(vector<int>& nums, int val) {
//在遍历数组的时候跟踪删除的个数n,然后同时将元素向后挪动n位就可以了
int cnt=0;
int size=nums.size();
for(int i=0;i<size;i++){
if(nums[i]==val)
cnt++;
else if(cnt>0)
nums[i-cnt]=nums[i];
}
return size-cnt;
}