
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
示例 1:
输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
示例 2:
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
提示:
好,看完题目的描述,我们来分析一下去求解这道题目
有了思路之后来分析一下



nums[++dst] = nums[src++];







简单地通过算法图解描述了一下,不知道你听懂没,如果没有再仔细读一下代码,然后自己动手画画图吧,说不定就能有思路了
有了步步算法图解的分析,相信已经迫不及待想要写代码了,可以先去写写看再来看。我这里会给出很多版本
nums[src] != nums[dst]这块,首先让dst++,然后做覆盖操作,接着再让src++int removeDuplicates(int* nums, int numsSize){
int src = 0, dst = 0;
while(src < numsSize)
{
if(nums[src] == nums[dst])
src++;
else
{
dst++;
nums[dst] = nums[src];
src++;
}
}
return dst + 1;
}

dst++是在前头的,所以我们完全可以使用一个前置++来完成,src++是在后头的,所以可以使用后置++来完成int removeDuplicates(int* nums, int numsSize){
int src = 0, dst = 0;
while(src < numsSize)
{
if(nums[src] == nums[dst])
src++;
else
nums[++dst] = nums[src++];
}
return dst + 1;
}

src++是一定会执行的,所以我们可以将其单独抽离出来,只需要去判断两者不相等的情况即可int removeDuplicates(int* nums, int numsSize){
int src = 0, dst = 0;
while(src < numsSize)
{
if(nums[dst] != nums[src])
{
//若是发现不相等,则dst++然后覆盖为src位置上的值
nums[++dst] = nums[src];
}
src++; //src无论如何都要++
}
return dst + 1; //最后返回的是去重后数组的个数,因此要 + 1
}

int removeDuplicates(int* nums, int numsSize){
int src = 1, dst = 0;
while(src < numsSize)
{
if(nums[dst] != nums[src])
{
//若是发现不相等,则dst++然后覆盖为src位置上的值
nums[++dst] = nums[src];
}
src++; //src无论如何都要++
}
return dst + 1; //最后返回的是去重后数组的个数,因此要 + 1
}

int removeDuplicates(int* nums, int numsSize){
int src = 1, dst = 1;
while(src < numsSize)
{
if(nums[dst] != nums[src])
{
//若是发现不相等,则dst++然后覆盖为src位置上的值
nums[++dst] = nums[src];
}
src++; //src无论如何都要++
}
return dst + 1; //最后返回的是去重后数组的个数,因此要 + 1
}

dst = 1时即让dst从1开始遍历时,在去重的过程中就无法实现我们想要的结果,第一个有重复的元素会被遗漏,所以对于dst不可以从1开始,只可以从0开始
以上就是本文所要描述的所有内容,感谢您对本文的观看,如有疑问请于评论区留言或者私信我都可以🍀
