7

移除元素

·2 分钟

🟢 Easy · 🏷️ 数组、双指针 · LeetCode#27

📖 题目

原地移除数组中所有等于 val 的元素,返回新数组的长度——不用管超出新长度后面的元素是什么。

输入输出
nums=[3,2,2,3], val=32nums=[2,2,_,_]
nums=[0,1,2,2,3,0,4,2], val=25nums=[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不需要
返回值无(原地修改)新数组长度