Given an array and a value, remove all instances of that value in place and return the new length.
The order of elements can be changed. It doesn't matter what you leave beyond the new length.
给定一个数组和一个数字,删除数组中相同的数字并返回数组的新长度。
这道题解法很多,第一种,每删除一个数字都将后面的所有的数字前移,O(n^2)复杂度。
第二种,使用变量i,j分别表示新旧数组的下标,当数组值和给定数字不同时,将A[j]赋值给A[i],否则,直接跳过不赋值,这样做的时间复杂度为O(n)。
代码如下:
class Solution {
public:
int removeElement(int A[], int n, int elem)
{
int i=-1,j;
for(j=0;j<n;j++)
{
if(A[j]!=elem)
A[++i]=A[j];
else
continue;
}
return i+1;
}
};
第三种,使用下标i,j分别从数组两边开始遍历,i停在左边开始第一个和给定数字相同的位置处,j停在右边开始第一个和给定数字不同的位置处,用j处的数字填补i处位置,相当于执行了删除操作,一直执行直到i>=j。
这种方法的代码:
class Solution {
public:
int removeElement(int A[], int n, int elem)
{
int i=0,j=n-1;
while(i<=j)
{
while(i<=j&&A[i]!=elem)
i++;
while(i<=j&&A[j]==elem)
j--;
if(i>j)
return j+1;
A[i]=A[j];
i++;
j--;
}
return j+1;
}
};
第三种方法的时间复杂度也是O(n),但是和第二种方法相比少了很多不需要的赋值操作,因为题目没有要求保持原数组的顺序,所以推荐第三种方法。