【前端算法每日一题】leetcode-080-删除有序数组中的重复项 II

87 阅读1分钟

题目描述

  • 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
  • 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

解题思路

  • 双指针(快慢指针)
  • 慢指针记录符合要求数组长度
  • 快指针遍历数组

解题代码(JavaScript)

var removeDuplicates = function (nums) {
  // 数组长度
  let len = nums.length;
  // 当数组长度小于等于二直接输出数组长度(根据题中描述到使得出现次数超过两次的元素只出现两次)
  if (len <= 2) {
    return nums.length;
  }
  // 慢指针
  let slow = 2;
  // 快指针
  let fast = 2;
  while (fast < len) {
    if (nums[slow - 2] !== nums[fast]) {
      // 快指针所指元素未超过两个
      // 将慢指针元素替换为快指针元素
      nums[slow] = nums[fast];
      // 慢指针向右移动
      slow++;
    }
    // 慢指针向前推两个元素值等于快指针元素,说明慢指针所指元素超过两个
    // 快指针向右继续遍历
    fast++;
  }
  return slow;
};