1、题目
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
2、解答
- 直接遍历法:类似283道题目逻辑一样,把不等于val的元素移动到数组左边即可。
- 双指针法:这个就是左右两边同时遍历数组,移动然后把右边不等于val的值移动到左边,左边等于val的元素移动到右边。
def removeElement(self, nums, val):
"""
直接遍历
:type nums: List[int]
:type val: int
:rtype: int
"""
val_index = 0
for index, i in enumerate(nums):
if i != val:
nums[val_index] = i
val_index += 1
nums = nums[:val_index]
return val_index
def removeElement2(self, nums, val):
"""
双指针法:
:type nums: List[int]
:type val: int
:rtype: int
"""
left = 0
right = len(nums)-1
while left<right:
while nums[right]==val and left<right:
right-=1
while nums[left]!=val and left<right:
left+=1
nums[left],nums[right]=nums[right], nums[left]
if nums[left]!=val:
left +=1
nums = nums[:left]
print(nums)
return left
本文探讨了如何在不使用额外空间的情况下,利用O(1)额外空间和原地修改输入数组的方法,通过直接遍历和双指针技巧解决给定数组中移除指定值的问题。两种方法的详细实现和比较将在文中呈现。
430

被折叠的 条评论
为什么被折叠?



