题目描述
思考过程
- 必要步骤:比对元素,找到与val相同的元素
- 选择方法:暴力解法,新创数组,把合适的元素填进去。指针法,利用数组的下标灵活变动元素。
- 确定切入点:是选择 nums[i] == val 还是选择 nums[i] != val。作者的想法是移动不等于val元素,变换下标,所以要选择nums[i] != val 。如果选择操作处理的是等于val的元素,目前没有想到好的方法
解题方法
利用数组下标,变换元素。一般这种方法称为快慢指针。
1.当nums[i] != val 时 ,nums[m] == nums[i], i++,m++
2.当nums[i] == val 时,i++,m不变。
3.i为了找到与val不同的元素下标,然后赋值给nums[m]
4.i走得比m快,会覆盖val元素,也不会漏掉其它元素
复杂度
- 时间复杂度:O(n),其中 n 是输入列表 nums 的长度。
- 空间复杂度:O(1),只使用了常数级别的额外空间。
时间复杂度:时间复杂度主要由 for 循环决定,该循环会遍历整个列nums,长度为 n。在每次循环中,执行常数时间的操作,包括比较和赋值操作(nums[m] = nums[i] 和 m += 1)。因此,时间复杂度为 O(n)。
空间复杂度:空间复杂度是由算法本身使用的额外空间决定的。在这段代码中,并没有使用额外的数据结构,只是在原地修改输入列表 nums。因此,空间复杂度为 O(1),即常数空间复杂度。
Code
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
m=0
for i in range(len(nums)):
if nums[i] != val :
nums[m] = nums[i]
m += 1
return m