1、题目描述:
LeetCode链接:删除有序数组中的重复项
2、解题思路:
双指针(快慢指针),相同的数只保留一个,首次遇到的不同的数依次往前放。
-
如果数组的长度为 0,则返回的新长度为 0 -
如果数组的长度大于 0 时,数组中至少包含一个元素,在删除重复元素之后也至少剩下一个元素,因此 nums[0] 保持原状即可,从下标 1 处开始覆盖重复元素
定义两个指针 fast 和 slow,分别为快指针和慢指针,快指针依次遍历数组,慢指针表示下一个不同元素要填入的下标位置,初始时两个指针都指向下标 0
快指针 fast 依次遍历数组中的每一个元素,对于遍历到的每个元素,如果满足 nums[fast] != nums[slow],说明 nums[fast] 是从 nums[slow] 后第一次出现的不同的元素,然后将 slow 加1,把 nums[fast] 赋值给 nums[slow]
画图理解:
重复上述过程:
最后可以得到:返回数组新长度 slow + 1
删除数组中的重复项动图演示如下:
代码如下:
int removeDuplicates(int* nums, int numsSize){
if(numsSize == 0)
return 0;
int fast = 0;
int slow = 0;
while(fast < numsSize)
{
if(nums[fast] == nums[slow])
{
fast++;
}
else if(nums[fast] != nums[slow])
{
slow++;
nums[slow] = nums[fast];
}
}
return slow + 1;
}
大家快去动手练习一下吧!
|