目录
前言
小伙伴们大家好,之前为大家分析了一篇力扣上的第二十七题,删除数组中的等于 指定值 的题。
本文为大家带来第二篇顺序表相关的力扣题:删除有序数组中的重复项。
题目
如下图所示:
那么我们看到,其实本题相对于上一篇文章的 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;
}
好的,那么本文到此就结束啦!如有错误,还请指正呀!