LeetCode #27 Easy
题目描述
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2,_,_]
输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3,_,_,_]
我的解题过程
解题思路:双指针法
这道题和第 26 题很像,都是要原地修改数组。区别在于这里是要移除特定值,而不是去重。
同样用双指针来解决:
left指针遍历整个数组,用来读取元素right指针指向当前有效元素应该放置的位置,用来写入元素- 当
nums[left] !== val时,说明这个元素需要保留,把它写入right位置,然后right++ - 当
nums[left] === val时,跳过这个元素,left继续往后走
这样遍历完后,前 right 个元素就是移除目标值后的结果。
function removeElement(nums: number[], val: number): number {
let left = 0,
right = 0;
while (left < nums.length) {
if (nums[left] !== val) {
nums[right] = nums[left];
right++;
}
left++;
}
return right;
}
小结
这道题和第 26 题本质上是同一类问题——用双指针实现数组的原地修改:
- 一个指针负责遍历(读)
- 一个指针负责记录有效位置(写)
- 只在满足条件时才执行写入操作
掌握了这个模式,很多类似的数组原地操作题目都能用这个思路解决。时间复杂度 O(n),空间复杂度 O(1)。