返回
LeetCode 27. 移除元素:JavaScript 双指针高效解法深入剖析
前端
2024-01-06 07:37:21
算法思路:双指针技巧
LeetCode 27. 移除元素 问题要求我们从一个数组中移除指定元素,并返回新数组的长度。使用双指针技术可以高效地解决此问题。
- 初始化双指针
let slow = 0;
let fast = 0;
- slow:慢指针,标记新数组的当前长度。
- fast:快指针,遍历数组并查找需要移除的元素。
- 遍历数组
使用 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,则跳过该元素,不进行拷贝。
- 返回新数组长度
遍历结束后,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),因为我们没有使用额外的空间来存储新数组。
总结:
使用双指针技术,我们可以高效地移除数组中的元素。这种方法简单易懂,并且具有较好的时间和空间复杂度。无论是初学者还是经验丰富的开发人员,掌握这种技术都非常有益。