第 7 章
移除元素
·约 2 分钟
🟢 Easy · 🏷️ 数组、双指针 · LeetCode#27
📖 题目
原地移除数组中所有等于 val 的元素,返回新数组的长度——不用管超出新长度后面的元素是什么。
| 输入 | 输出 |
|---|---|
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,3,0,4,_,_,_] |
💡 思路
和移动零是同一套快慢双指针模板,保留条件从 != 0 换成 != val。区别只有一点:移动零要求把慢指针后面显式填成 0(0 本身是保留的值),这题不用填充,慢指针最终停在哪,那就是新数组的长度,直接返回。
💻 代码
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
slow = 0
for fast in range(len(nums)):
if nums[fast] != val:
nums[slow] = nums[fast]
slow += 1
return slow
slow 是已经放置的有效元素个数,也就是新数组长度。别写成 len(nums) - slow——那是被删掉的个数,不是要求的答案。
时间复杂度 O(n),空间复杂度 O(1)。
🔀 跟移动零对比
| 移动零 | 移除元素 | |
|---|---|---|
| 保留条件 | != 0 | != val |
| 尾部填充 | 要填回 0 | 不需要 |
| 返回值 | 无(原地修改) | 新数组长度 |