力扣:探索初级算法——数组篇——删除排序数组中的重复项---详细题解

删除 排序数组中的 重复项


题目:

给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

示例 1:

给定数组 nums = [1,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。

你不需要考虑数组中超出新长度后面的元素。

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝 int len = removeDuplicates(nums);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int
i = 0; i < len; i++) {
print(nums[i]); }

算法思路:

方法:双指针法

c语言代码:

int removeDuplicates(int* nums, int numsSize){
   int i = 0, j;
   if(nums == NULL || numsSize == 0)     //两者情况都要写,不然结果通不过。
    return 0;
   for(j = 1; j < numsSize; j++)
   {
       if(nums[j] != nums[i])
       {
           i++;
           nums[i] = nums[j];
       }
   }
   return i + 1;
}


算法

**数组是经过 排序的,**放置两个指针 i 和 j ,初始时一个在前,一个在后(i=0,j=1)。

j 从数组下标1的位置 一直到 数组的末尾 为止(用for循环表示):

只要nums[ i ] != nums[ j ]——则i++,且把 nums[j] 的值复制到 nums[i](此时的 i 应该是加1后的 i )

如果nums[i] = nums[j]——则什么都不做,直接进入下一个循环,即 j++ , 跳过重复项。


收获

小白不太懂:

1) 自己在纸上举个例子画一画会更加明白
2)j 是从数组的第二个数开始遍历的,你会发现nums[0]始终都没有被重新赋值————但是这题返回的数组是根据 你返回的 长度 截取的原始数组——也就是说你没有重新赋值的位置,原来是啥数就是啥数,输出的时候会直接输出原来的值。

你可能感兴趣的:(力扣刷题笔记)