题目:
    移除元素

    • 原地移除指定的元素
    • 返回移除后数组的长度;且前n位须是移除后的元素

    思路:
    需要原地移除,那么就不能使用额外的空间,即空间复杂度是【LeetCode】27.移除元素 - 图1
    这个时候可以考虑双指针,慢指针i,快指针j。只需要把指针j != val的元素复制给位置i,即前i个元素即为删除指定元素val后的元素,移除后数组的长度即为i。

    1. class Solution:
    2. def removeElement(self, nums: List[int], val: int) -> int:
    3. i = 0
    4. for j in range(len(nums)):
    5. if nums[j] != val:
    6. nums[i] = nums[j]
    7. i += 1
    8. return i

    怎么利用移除后的元素顺序可以改变这一条件呢?
    也可以利用对撞指针的思想,一个指针i指向头,一个指针j指向尾。当nums[i] == val,交换nums[i],nums[j]。

    1. class Solution:
    2. def removeElement(self, nums: List[int], val: int) -> int:
    3. i = 0
    4. j = len(nums) - 1
    5. while i <= j:
    6. if nums[i] == val:
    7. nums[i], nums[j] = nums[j], nums[i]
    8. j -= 1
    9. else:
    10. i += 1
    11. return i