删除有序数组中的重复项--力扣

今天我们来看一道简单的力扣题,首先来看一下题目。

当我们看到这道题后首先想到的肯定是暴力求解,但是那样的话显然空间复杂度极高,已经达到了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就行了。 

猜你喜欢

转载自blog.csdn.net/m0_57249790/article/details/122441273