移除元素
给你一个数组nums和一个值val ,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用0(1)额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 本题简单来讲即是数组去重的问题
有三种思路:
思路1就是简单的遍历 ,时间复杂度为o(N^2),这里就不展示代码了,因为效率太低了。
思路2是开一个tmp的空间,然后也是遍历数组 ,将不是要去重的值全都依次放入tmp数组里,然后再将tmp的元素拷贝给num数组里。
该时间复杂度为O(N), 空间复杂度为O(N).
思路3是使用两个指针src和dst,指针src依次遍历nums数组里的数,当指针src所指的值不等于所要去找的值时,用指针dst去标记,然后src++,dst++,直到src到最后一个数遍历完为止。
这种思路的时间复杂度为O(N),空间复杂度为O(1),这种思路效率最高,这道题也是一道经典的双指针的题目。
int removeElement(int* nums,int numSize,int val)
{
int src = 0, dst = 0;
while (src < numSize)
{
if (nums[src] != val)
{
nums[dst] = nums[src];
src++;
dst++;
}
else
{
src++;
}
}
return dst;
}
int main()
{
int nums[10] = { 1,3,2,4,3,5,6,7,3,2 };
printf("%d ",removeElement(&nums, 10, 3));
return 0;
}