给你一个数组 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
复杂度分析
- 时间复杂度:,其中 n 为序列的长度。我们只需要遍历该序列至多一次。
- 空间复杂度:。我们只需要常数的空间保存若干变量。