数组中的简单题,自用
题目描述:
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1)
额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
思路:
由于使用O(1)空间复杂度,所以不能使用新的数据结构去存储,考虑使用首尾指针,设置两个指针,让i指向数组头,让j指向数组尾,使用一个while循环遍历数组,终止条件为头指针大于尾指针。当头指针指向元素等于val时,交换头尾指针指向的值,此时尾指针指着的元素值为val,所以尾指针前移,当头指针指向的元素不等于val,向后移头指针。这样在循环结束后,头指针的长度就是所求长度。
本以为这个思路下,虽然能找到所有元素,但是不一定按照原地修改,所以犹豫了很久,但是还是抱着试一试的心态尝试了一下,结果ac了~,有大佬告诉我为什么吗?
题解(python3):
代码语言:javascript复制class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
i = 0 # 头指针
j = len(nums)-1 # 尾指针
while i <= j:
if nums[i] == val:
# 头指针找到目标值
nums[i], nums[j] = nums[j], nums[i] # 交换头尾指针所指的值
j -= 1 # 尾指针后移
else:
i = 1 # 咩有目标值,头指针前移
return i
补充:
写完题解才发现题目里面强调了元素顺序可以改变~,以后还是要先认真审题啊。