@LeetCode刷题
题目
一、实现思路
- 首先排除数组长度小于等于1的可能:
if( nums.length<=1 )
{
return nums.length;
}
- 主要思路有以下几种:
以下思路的一致方向是:将后面的不同的元素覆盖到当前重复元素的下标中,最后返回的是排序好后的子数组长度。
1)设置双指针p1=1
和p2=1
,因为数组已经排序过,所以当前值与前一个值相比不同,当前元素一定是新元素,将新值nums[p1]
覆盖到当前可用替换的下标p2
中;
2)设置两个指针p=0
和q=1
,两个指针指向的元素比较,如果不相等并且q-p>1
,把q
值赋给p+1
,因为数组已经排过序,所以后续元素的赋值不会影响结果;
3)设置重复总数count
,如果元素与前一个值相等,即重复,count++
,并且nums[i=count] = nums[i]
,最后返回nums.length-count
。
二、总体代码
1)第一种
int n = nums.length;
if( n==0 ){
return 0;
}
int p1=1, p2=1;
while( p1<n && p2<n )
{
if( nums[p1]!=nums[p1-1] )
{
nums[p2] = nums[p1];
++p2;
}
++p1;
}
return p2;
2)第二种
int n = nums.length;
if( n==0 ){
return 0;
}
int p=0, q=1;
while( q<n )
{
if( nums[p]!=nums[q] )
{
if( q-p>1 )
{
nums[p+1] = nums[q];
}
++p;
}
++q;
}
return p+1;
3) 第三种
int count = 0;
int n = nums.length;
for( int i=1; i<n; ++i )
{
if( nums[i]!=nums[i-1] )
{
nums[i-count] = nums[i];
}
else
{
++count;
}
}
return n-count;
总结
我一开始的思路是:如果nums[p1]!=nums[p2]
,那么将p1<=i<p2
的元素全部赋值为nums[p2]
,思路没错,就是有点冗余,我忽略了数组已排序,nums[p1+1]=nums[p2]
与上述结果相同。