给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。
示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。
你不需要考虑数组中超出新长度后面的元素。
题目:力扣
一开始我的解答:(忽略我这里的jtem)
def removeElement(nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
size = len(nums)
i = 0
for index, item in enumerate(nums):
if nums[index] == val:
for jtem in range(i + 1, size):
nums[jtem - 1] = nums[jtem]
size -= 1
i += 1
return size
得到的结果是
原因是移动元素的时候,是需要在当前位置再去扫描,而不是下一个位置去扫描,而for循环会一直往前扫描,所以代码更改成下面的方式:
class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
size = len(nums)
i = 0
while i < size:
if nums[i] == val:
for jtem in range(i + 1, size):
nums[jtem - 1] = nums[jtem]
i -= 1
size -= 1
i += 1
return size
上面是暴力解法
空间复杂度:O(1) 时间复杂度:O(n^2)