实现思路
1 思维重点:
- 原地移除 + 顺序不重要
- 数组类==> 快慢指针/ 头尾指针
2 参考实现:
代码实现
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]]
}