题目比较简单,开始为了省事使用的方法1,看见时间224ms确实有点高,就改成方法二了39ms
方法一:对数组从后向前便利,碰见一个重复数组就把后面的元素全部前移,实现比较简单,由于有大量元素移动,时间很长。
方法二:对数组从前向后遍历,使用两个变量spst和sped记录数组中的无效元素,start变量循环找到新元素直接放到spst位置。少了大量元素移动,所以比较快。
下面给出代码:
方法一代码:
class Solution {
public:
int removeDuplicates(int A[], int n) {
int t = 0,before = n-1,after = n-1,count = n;
while( before > 0 )
{
before--;
if( A[before] == A[after] )
{
t = before+1;
while( t < count )
{
A[t-1] = A[t];
t++;
}
after = before;
count--;
}
else
{
after--;
}
}
return count;
}
};
int removeDuplicates(int A[], int n) {
if( n == 0 || n == 1 )
return n;
int start = 1,val = 0 , spst;
//找第一个空闲元素位置
while( start < n )
{
if( A[start] != A[val] )
{
start++;
val++;
}
else
{
spst = start;
break;
}
}
//start = n 则无重复元素,返回n
if( start == n )
return n;
else
{
//处理空闲元素后的元素
while( start < n )
{
//找第一个有效元素位置
while( start < n && A[start] == A[val] )
{
start++;
}
//如果找到,有效元素前移到spst位置,更新spst、start、val值
if( start != n )
{
A[spst++] = A[start++];
val++;
}
}
//最后长度为val值+1
return val+1;
}
}