26. 删除有序数组中的重复项

快慢指针

解析思路

  1. 数组是有序的,那么重复的元素一定会相邻;

    • 比较 slowfast 位置的元素是否相等;
    • 如果相等 fast 后移 1 位;
    • 如果不相等,此时说明 slow 和 fast 之间都是重复的,fast 位置的元素是不重复的元素,slow 后移 1 位,将 fast 位置的元素复制到 slow 位置上,fast 后移一位继续寻找不同的值;
  2. 重复上述过程,直到 fast 等于数组长度;

  3. 返回 slow + 1 即为新数组长度;

图解

复杂度

  1. 时间复杂度:O(n)

  2. 空间复杂度:O(1)

代码实现

function removeDuplicates(nums: number[]): number {
  let slow: number = 0;
  let fast: number = 0;

  while (fast < nums.length) {
    if (nums[fast] !== nums[slow]) {
      slow++;
      nums[slow] = nums[fast];
      // [nums[slow], nums[fast]] = [nums[fast], nums[slow]]; // 替换和交换均可以
    }
    fast++;
  }

  return slow + 1;
}
打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 快慢指针
    1. 1.1. 解析思路
    2. 1.2. 图解
    3. 1.3. 复杂度
    4. 1.4. 代码实现