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

目录

前言

题目

思路

起始位置:

第一次移动:

 之后移动:

代码实现


前言

小伙伴们大家好,之前为大家分析了一篇力扣上的第二十七题,删除数组中的等于 指定值 的题。

本文为大家带来第二篇顺序表相关的力扣题:删除有序数组中的重复项。

题目

如下图所示:

那么我们看到,其实本题相对于上一篇文章的 27 题来说,只是删除的对象不同了以及现在的序列是有序的之外,在其他所有方面,都是一模一样的,所以这里我们对于题目就不做过多的赘述了。

tips:上篇文章:LeetCode:27. 移除元素_憨憨二号耶!的博客-CSDN博客

不同点:我们需要删除该有序数组中重复出现的元素,也就是如果某个元素出现2次以上,我们只需要留下一个即可,以及。然后思路基本就是一样了。

 注:

这两道题我们会用同样的思路实现,但是不代表这样的题只有这一种思路,因为我们的思路注定不会改变数组中元素原有的先后顺序,所以上图中红色框起来的部分对于本题C语言思路来说,是不需要的。也就是说有这条要求和没有是一样的。

思路

初识情况如下图所示:首先我们需要三个指针,begin 和 end 用来比较两元素是否相等,des 指针用来记录当 end 指针指向的元素不等于 begin 指针指向的元素的时候,记录begin指针指向的元素,也就是留下一个相等的元素。

起始位置:

我们将 end 指向下标为 1 的位置,因为 begin 指向的是下标为 0 的位置。 然后des指向起始位置。如下图所示:

 

第一次移动:

然后,我们需要做的就是比较 begin 和 end 指向的元素,如果两元素相等,就让 end 往后移动一位,再判断,如果此时不相等了,就将 该元素 第一次出现的 begin 指向的地方的元素赋给 des 指向的元素,然后将 begin 移动到 end 的位置上面,再让 end 往后移动一位,此时 des 也应往后移动一位。

如下图所示:

 之后移动:

之后的步骤就同第二步没有区别了,一直到最后:

 

此时,因为我们的循环只能进行到 end 小于 数组个数的时候,所以如果有最后一个单独出现的元素,那么我们是需要在循环结束之后,将最后一个值赋给 des ,然后 des 再后移返回 des 个元素(这个步骤是很容易出错的,所以小伙伴们一定要小心斟酌哦!)。

代码实现

力扣代码实现:

int removeDuplicates(int* nums, int numsSize) {
    int des=0;
    int begin=0;
    int end=1;
    for(end=1;end<numsSize;end++)
    {
      if(nums[begin]!=nums[end])
      {
        nums[des]=nums[begin];
        des++;
        begin=end;
      }
    }
    nums[des]=nums[begin];
    des++;
    return des;
}

好的,那么本文到此就结束啦!如有错误,还请指正呀!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值