返回

删除有序数组中的重复项:LeetCode 数组实战(javascript)

前端

引言

LeetCode是一家专注于编程练习和面试准备的在线平台,它拥有大量编程题目和丰富的学习资源,受到众多程序员的青睐。数组是LeetCode中常见的题目类型,也是程序员在实际工作中经常遇到的数据结构。本文将带领你探索LeetCode数组问题——“删除有序数组中的重复项”,并为你提供四种不同解法的详细解析。

解法1:基础双指针法

这种方法使用两个指针,一个指针指向当前正在处理的元素,另一个指针指向结果数组中的最后一个元素。当遇到重复元素时,我们只需将结果数组指针指向当前指针,并将当前指针指向下一个元素。这种方法简单易懂,但效率较低,因为它需要遍历整个数组两次。

代码示例:

function removeDuplicates(nums) {
  if (nums.length === 0) {
    return 0;
  }
  let i = 0;
  let j = 0;
  while (i < nums.length) {
    if (nums[i] !== nums[j]) {
      nums[++j] = nums[i];
    }
    i++;
  }
  return j + 1;
}

时间复杂度: O(n)

空间复杂度: O(1)

解法2:优化双指针法

这种方法与解法1类似,但它使用了一个额外的变量来记录上一次遇到的元素。当遇到重复元素时,我们只需跳过该元素,继续处理下一个元素。这种方法比解法1效率更高,因为它只遍历数组一遍。

代码示例:

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

时间复杂度: O(n)

空间复杂度: O(1)

解法3:集合法

这种方法使用集合数据结构来存储数组中的元素。当遇到重复元素时,我们只需将该元素添加到集合中。最后,我们将集合中的元素复制回数组中。这种方法的效率很高,但它需要额外的空间来存储集合。

代码示例:

function removeDuplicates(nums) {
  if (nums.length === 0) {
    return 0;
  }
  const set = new Set();
  for (let i = 0; i < nums.length; i++) {
    set.add(nums[i]);
  }
  let index = 0;
  for (const num of set) {
    nums[index++] = num;
  }
  return index;
}

时间复杂度: O(n log n)

空间复杂度: O(n)

解法4:快慢指针法

这种方法使用两个指针,一个指针指向当前正在处理的元素,另一个指针指向结果数组中的最后一个元素。当遇到重复元素时,我们只需将快指针指向下一个元素。当快指针遇到与慢指针不同的元素时,我们只需将快指针指向的元素复制到结果数组中。这种方法比解法1和解法2效率更高,因为它只遍历数组一遍。

代码示例:

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

时间复杂度: O(n)

空间复杂度: O(1)

结语

本文详细介绍了LeetCode数组问题——“删除有序数组中的重复项”的四种不同解法,包括基础双指针法、优化双指针法、集合法和快慢指针法。每种方法都有其优缺点,你可以根据实际情况选择最适合自己的方法。希望本文对你学习LeetCode数组问题有所帮助,也希望你能够在LeetCode的学习之旅中取得成功。