一、原理说明
在原数组中进行重复数字的删除,显然我们无法用构建一个新的数组来完成这件事,那么我们依然可以利用快慢指针的方法来解决。
int fast=1;//快指针
int slow=1;//慢指针
while(fast<numsSize)
在开始时让快慢指针指向数组的第二个位置。并将循环的条件设置为fast小于numsSize(数组大小),这样如果数组长度只有1,那么便不会进入循环,直接将数组返回。因为显然长度为1的数组必然不会含有重复项。
while(fast<numsSize)
{
if(nums[fast]!=nums[fast-1])
{
nums[slow]=nums[fast];
++slow;
}
++fast;
}
让fast位置与fast-1位置的数值进行比较,若相等则表明有重复项,进入重复地带;让slow指针停止运动,保存重复项的第二个位置,保证留下一个重复数;让fast去寻找离开重复项地带的第一个位置,执行以下操作。
if(nums[fast]!=nums[fast-1])
{
nums[slow]=nums[fast];
++slow;
}
相当于将slow后边的数向前挪动(fast-slow)个位置,直到fast找到新的重复地带或者将整个数组遍历完全。
二、实例演示
如上图所示。当fast与slow走到数字3的位置时,fast与fast-1的值相等,有重复项,slow停止运动;fast走到4,fast与fast-1不相等,离开重复地带,将数据向前挪动。
如上图所示。当fast遍历完数组后,删除操作便结束了,slow的位置就是新数组的长度,将其返回即可。
三、实现代码
int removeDuplicates(int* nums, int numsSize) {
int fast=1;
int slow=1;
while(fast<numsSize)
{
if(nums[fast]!=nums[fast-1])
{
nums[slow]=nums[fast];
++slow;
}
++fast;
}
return slow;
}