给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
思路:通过遍历数组判断是否为val
是:通过数组的位移,覆盖val
int removeElement(int* nums, int numsSize, int val) {
int end = numsSize - 1;
while(end >= 0)
{
if(nums[end] == val){
if(end == numsSize - 1)
numsSize--;
else{
int start = end;
while(start < numsSize - 1){
nums[start] = nums[start + 1];
start++;
}
numsSize--; //等所有数据都完成位移之后,再个数--。
}
}
end--;
}
return numsSize;
}
此时时间复杂度是O(N*N)
空间复杂度是O(1)
注意点:numsSize--一定要注意封装的位置。一般封装在循环之外
2.删除数据之后,记得numsSize--、
优化:时间复杂度太大,将时间复杂度减小
优化:把一个数组当成两个数组处理
int removeElement(int* nums, int numsSize, int val) {
int dest = 0;
int src = 0;
while(src < numsSize)
{
if(nums[src] != val)
{
nums[dest++] = nums[src++]; //dest和src同一位置也可以,数组解引用看的是数值
}
else
src++;
}
return dest;
}