今天我们来看一道简单的力扣题,首先来看一下题目。
当我们看到这道题后首先想到的肯定是暴力求解,但是那样的话显然空间复杂度极高,已经达到了O(N),并且不符合我们题中要求的O(1)。
那么我们就需要在数组内实现数的移动。
我们接下来要用到的方法名为双指针法,既然叫双指针法,由此可得需要有两个名义上的指针分别指向两个数,一个快指针,一个慢指针。
快指针的作用是遍历数组,去找出那个与自身前面元素相同的元素。
慢指针的作用就是记录把那些相同的元素覆盖掉之后的元素,并且由他们组成的数组就是新的数组。
首先将他们都指向第二个元素;
那么开始用快指针进行遍历。假设数组为nums,那么第一个就是判断nums[i-1]是否等于nums[j]。如果不等于那么将j指向的数赋给i,并且将慢指针向后移动。
并且无论是否相等,快指针都要向后移动,因为它需要遍历整个数组。
代码如下:
int removeDuplicates(int* nums, int numsSize)
{
if (numsSize == 0)
return 0;
int i = 1;
for (int j = 0; j < numsSize; j++)
{
if (nums[j] != nums[i - 1])
{
nums[i] = nums[j];
i++;
}
}
return i;
}
最终返回i就行了。