描述:给定一个有序数组,移除数组中重复的数字并保证当前数字只出现一次,最后返回移除后的数组长度。
如:输入:array A={1,1,2}; 输出:length=2;A={1,2};
思路一:申请一个新数组,并从第二位数组元素开始遍历,将每个元素与加入新数组的元素进行比较,若相等则跳过否则加入新数组中。时间复杂度为线性,空间复杂度为线性;
class solution{
public:
int remove(int &A[],int n){
if(n==0)return 0;
int *B=(int *)malloc(sizeof(int)*n);
*B=A[0];
int len=1;
for(int i=1;i<n;i++)
{
if(*B==A[i])continue;
++*B=A[i];
++len;
}
return len;
}
};
思路二:可以不必申请空间直接在原数组上标记未重复元素的位置。时间复杂度为线性,空间复杂度为1;
class solution{
public:
int remove(int &A[],int n){
if(n==0)return 0;
int index=0;
for(int i=1;i<n;i++)
{
if(A[index]!=A[i])
A[++index]=A[i];
}
index++;
return index;
}
};
思路三:可以直接使用C++STL。时间复杂度为线性,空间复杂度为1;
#include<algorithm>
class solution{
public:
int remove(int &A[],int n){
return distance(A,unique(A,A+n));
};