27. 移除元素

149 阅读1分钟

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]

解法一

解法和26. 删除有序数组中的重复项一样。

自己的解法:

def removeElement1(nums, val):
    if not nums: return len(nums)
    point = 0  # 声明一个指针,从0开始
    while point < len(nums):
        if nums[point] == val:
            del nums[point]  # 如果和目标值相等,就删除
        else:
            point += 1  # 如果和目标值不等,就指向下一位
    return len(nums)

解法二

官方的解法: 双指针

def removeElement2(nums, val):
    n = len(nums)
    left = 0
    for right in range(n):
        if nums[right] != val:
            nums[left] = nums[right]
            left += 1
    return left

双指针优化后的解法:

def removeElement3(nums, val):
    left, right = 0, len(nums) - 1
    while left <= right:
        if nums[left] == val:
            # 如果左指针指向的元素等于目标值,就将右指针指向的元素赋值给左指针的位置
            nums[left] = nums[right]
            # 然后右指针向左移动一位
            right -= 1
        else:
            left += 1  # 如果左指针指向的元素不等于目标值,左指针向右移动一位
    return left
复杂度分析
  • 时间复杂度:O(n)O(n),其中 n 为序列的长度。我们只需要遍历该序列至多一次。
  • 空间复杂度:O(1)O(1)。我们只需要常数的空间保存若干变量。

力扣官方答案