LeetCode 27. Remove Element 题解题目描述给你一个数组nums和一个值val你需要原地移除所有数值等于val的元素并返回移除后数组的新长度。不要使用额外的数组空间你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1输入nums [3,2,2,3], val 3 输出2, nums [2,2] 解释函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如函数返回的新长度为 2 而 nums [2,2,3,3] 或 nums [2,2,0,0]也会被视作正确答案。示例 2输入nums [0,1,2,2,3,0,4,2], val 2 输出5, nums [0,1,4,0,3] 解释函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。解题思路方法双指针思路使用两个指针一个慢指针slow指向当前已处理的非val元素的末尾一个快指针fast遍历整个数组初始时slow和fast都指向 0遍历数组如果nums[fast]不等于val说明找到一个非val元素将nums[fast]赋值给nums[slow]然后slow右移一位无论是否找到非val元素fast都右移一位遍历结束后slow就是移除val后的数组长度复杂度分析时间复杂度O(n)其中 n 是数组的长度。只需要遍历数组一次。空间复杂度O(1)只需要常数级的额外空间。代码实现方法双指针class Solution: def removeElement(self, nums: List[int], val: int) - int: n len(nums) # 慢指针指向当前已处理的非 val 元素的末尾 slow 0 # 快指针遍历整个数组 for fast in range(n): # 如果找到一个非 val 元素 if nums[fast] ! val: # 将非 val 元素赋值给 nums[slow] nums[slow] nums[fast] # slow 右移一位 slow 1 # slow 就是移除 val 后的数组长度 return slow测试用例测试用例 1输入nums [3,2,2,3], val 3输出2测试用例 2输入nums [0,1,2,2,3,0,4,2], val 2输出5测试用例 3输入nums [], val 0输出0测试用例 4输入nums [1], val 1输出0总结本题是双指针的经典应用问题主要考察对双指针技巧的理解和使用。通过使用慢指针和快指针我们可以在原地移除数组中的指定元素。双指针的核心思想是慢指针指向当前已处理的非val元素的末尾快指针遍历整个数组当找到非val元素时将其移动到慢指针的位置然后慢指针右移。这种方法不仅适用于移除元素问题还可以应用于许多其他需要原地修改数组的问题例如删除排序数组中的重复元素、移动零等。掌握双指针的使用对于解决这类问题非常重要。