【Daily Interview】- 22 删除排序数组中的重复项

896 阅读1分钟

题目

img01

光看题目是非常简单的,但这里有一个限制条件,就是必须在原地修改数组,并且只能使用 O1 的额外空间

其实前面也遇到过类似的限制,比如环形链表,当时我们的解决方案是快慢指针:事实上,在限制额外空间为 O1 的时候,通常都能使用快慢指针的方式来解决问题,这道题目的目的其实也就是帮助我们建立使用快慢指针的思维。

这里我们以数组 [1, 1, 2, 3, 3 ] 为例,创建两个指针 slowfast 都指向 arr[0]

  • 每一次遍历 fast 都自增 1
  • slow == fast,则 slow 不变
  • slow ≠ fast,则 slow 自增 1,并且将 fast 位置的值赋值过来

以上述步骤完成对整个数组的遍历之后,数组就已经实现了重排,而 slow 则指向其尾端,具体可以看看下图:

img02

思路很简单,这里直接实现代码即可:

var removeDuplicates = function (nums) {
  const len = nums.length;
  let slow = 0;
  for (let fast = 0; fast < len; fast++) {
    if (nums[fast] !== nums[slow]) {
      slow++;
      nums[slow] = nums[fast];
    }
  }
  return slow + 1;
};

tip💡:题目需求是返回新数组的长度,所以返回 slow +1

结果如下:

img03