LeetCode每日一题 002 删除排序数组中的重复项

1、解题思路

从最终结果来看,子数组中依次记录的是不重复的数组元素。因此,目标拆分为两点:

1)找到数组中所有不重复的元素;

2)将找到的不重复元素依次填入子数组中。

比较直观的解法是,先遍历原数组A,把不重复的元素记录在另一数组B中,再把B中元素填到A首元素开始的子数组中。

题目要求不使用额外数组,并只能使用0(1)额外空间。

再看直观解法的分析,新增了数组B,这部分空间是可以省去的,因为并不需要把所有不重复元素找出来再填入原数组中。

1)设定变量last,记录最新找到非重复元素,初始值为首元素;

2)设定变量count,记录目前已找到非重复元素个数,初始值设为1,新找到非重复元素可填入数组第count位;

3)从1开始遍历数组,判断当前元素是否与last相同,相同则跳过,否则记录到count未,并更新last和count值;

2、有效题解

int removeDuplicates(int* nums, int numsSize) {
    if (NULL == nums || numsSize < 0)
    {
        return -1;
    }
    if (0 == numsSize)
    {
        return 0;
    }
    
    int last = nums[0];
    int count = 1;
    
    for (int i = 1; i < numsSize; i++)
    {
        if (nums[i] != last)
        {
            nums[count] = nums[i];
            last = nums[i];
            count++;
        }
    }
    
    return count;
}

3、小结

关注程序时间复杂度和空间复杂度,有时可能需要牺牲一者来优化另一者,当没有这种诉求时应尽可能使两者都最优。

改进点:

1、比较数组首尾元素,当首尾元素相同时,可免去遍历数组;

2、

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值