跳到主要内容

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

链接:80.删除有序数组中的重复项II
难度:Medium
标签:数组、双指针
简介:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。

题解 1 - typescript

  • 编辑时间:2021-04-06
  • 执行用时:104ms
  • 内存消耗:40.1MB
  • 编程语言:typescript
  • 解法介绍:检测到一个重复数就后移。
function removeDuplicates(nums: number[]): number {
const len = nums.length;
const remove = (index: number) => {
const num = nums[index];
nums.splice(index, 1);
nums.push(num);
};
let lastIndex = len;
for (let i = 0; i < lastIndex - 1; i++) {
const num = nums[i];
if (nums[i] !== nums[i + 1]) continue;
while (i + 2 < lastIndex && nums[i + 2] === num) {
remove(i);
lastIndex--;
}
}
return lastIndex;
}

题解 2 - typescript

  • 编辑时间:2021-04-06
  • 执行用时:92ms
  • 内存消耗:39.7MB
  • 编程语言:typescript
  • 解法介绍:利用快慢指针,慢指针赋值,快指针读取最新值。
function removeDuplicates(nums: number[]): number {
const len = nums.length;
if (len <= 2) return len;
let slow = 2;
for (let fast = 2; fast < len; fast++) {
const num = nums[fast];
if (nums[slow - 2] !== num) {
nums[slow++] = num;
}
}
return slow;
}