Q4-LeetCode27-移除元素

197 阅读1分钟

实现思路

1 思维重点:

  • 原地移除 + 顺序不重要
  • 数组类==> 快慢指针/ 头尾指针

2 参考实现:

01-官方实现

代码实现

1 方法1: 双指针 + 直接覆盖法 时间复杂度:O(n); 空间复杂度: O(1)

function removeElement(nums: number[], val: number): number {
  let k = 0
  for (let i = 0; i < nums.length; i++) {
    if (nums[i] !== val) {
      nums[k++] = nums[i]
    }
  }
  return k
};

2 方法2 头尾指针 + 交换法 时间复杂度:O(n); 空间复杂度: O(1)

function removeElement(nums: number[], val: number): number {
  let front = 0, tail = nums.length -1 
  while (front <= tail) {
    // 易错点1: 内部while也需判断front <= tail,避免无相等val导致死循环
    while (front <= tail && nums[front] !== val) front++
    while (front <= tail && nums[tail] === val) tail--
    // 易错点2: 这一步是必须的,避免让front和tail值误增/误减
    if (front >= tail) break;
    swap(nums, front++, tail--)
  }
  return front
}

function swap(arr, i, j) {
  [arr[i] , arr[j]] = [arr[j], arr[i]]
}