LeetCode - 26. 删除有序数组中的重复项

@LeetCode刷题


题目

在这里插入图片描述


一、实现思路

  1. 首先排除数组长度小于等于1的可能:
if( nums.length<=1 )
{
	return nums.length;
}
  1. 主要思路有以下几种:
    以下思路的一致方向是:将后面的不同的元素覆盖到当前重复元素的下标中,最后返回的是排序好后的子数组长度。
    1)设置双指针p1=1p2=1,因为数组已经排序过,所以当前值与前一个值相比不同,当前元素一定是新元素,将新值nums[p1]覆盖到当前可用替换的下标p2中;
    2)设置两个指针p=0q=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]与上述结果相同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值