题目描述:
给定一个数组和一个值,在原地删除与值相同的数字,返回新数组的长度。
这道题目做暴力的想法就是,用一个指针从头到尾遍历,删除哪个元素就把后面的元素统一向前移动一个位置。但是这样的时间复杂度很大,可能要移动很多的元素。
这里利用快速排序中划分的一种思想:用两个指针,后一个指针做遍历用,前一个指针作为一个tag,表示这个tag之前的元素都满足要求。
那么具体的代码:
int removeElement(vector<int> &arr, int elem)
{
// write your code here
int size = arr.size();
if(size == 0)
{
return 0;
}
int pre = -1;
for(int cur = 0; cur < size; ++cur)
{
if(arr[cur] != elem)
{
++pre;
if(cur != pre)
{
swap(arr[pre], arr[cur]);
}
}//if
}//for
return pre + 1;
}