返回

LeetCode 27. 移除元素:JavaScript 双指针高效解法深入剖析

前端

算法思路:双指针技巧

LeetCode 27. 移除元素 问题要求我们从一个数组中移除指定元素,并返回新数组的长度。使用双指针技术可以高效地解决此问题。

  1. 初始化双指针
let slow = 0;
let fast = 0;
  • slow:慢指针,标记新数组的当前长度。
  • fast:快指针,遍历数组并查找需要移除的元素。
  1. 遍历数组

使用 while 循环遍历数组 nums:

while (fast < nums.length) {
  if (nums[fast] !== val) {
    nums[slow] = nums[fast];
    slow++;
  }
  fast++;
}
  • 如果 nums[fast] 不等于需要移除的值 val,则将 nums[fast] 复制到 nums[slow],并使 slow 指针右移一位。
  • 如果 nums[fast] 等于 val,则跳过该元素,不进行拷贝。
  1. 返回新数组长度

遍历结束后,slow 指针指向新数组的末尾,因此返回 slow 即可。

return slow;

代码示例:

/**
 * 移除数组中的元素
 * @param {number[]} nums 数组
 * @param {number} val 需要移除的元素
 * @return {number} 新数组的长度
 */
const removeElement = (nums, val) => {
  let slow = 0;
  let fast = 0;

  while (fast < nums.length) {
    if (nums[fast] !== val) {
      nums[slow] = nums[fast];
      slow++;
    }
    fast++;
  }

  return slow;
};

运行结果:

console.log(removeElement([3, 2, 2, 3], 3)); // 2
console.log(removeElement([0, 1, 2, 2, 3, 0, 4, 2], 2)); // 5

复杂度分析:

  • 时间复杂度:O(n),其中 n 是数组 nums 的长度。
  • 空间复杂度:O(1),因为我们没有使用额外的空间来存储新数组。

总结:

使用双指针技术,我们可以高效地移除数组中的元素。这种方法简单易懂,并且具有较好的时间和空间复杂度。无论是初学者还是经验丰富的开发人员,掌握这种技术都非常有益。