https://leetcode-cn.com/problems/find-all-numbers-disappeared-in-an-array/
错误版本:
for 是一层循环, in判断需要遍历, remove也需要遍历,所以其实是一个
O
(
n
3
)
O(n^{3})
O(n3)的时间复杂度。
https://www.ics.uci.edu/~brgallar/week8_2.html
查看答案:
正确版本:
class Solution:
def findDisappearedNumbers(self, nums: List[int]) -> List[int]:
miss_nums=[]
for i in nums:
if nums[abs(i)-1] >0 :
nums[abs(i)-1] *= -1
for i in range(len(nums)):
if nums[i] >0:
miss_nums.append(i+1)
return miss_nums
小结:
- 数组是固定长度的,不建议在原数据上进行添加或删除元素,可以修改。
- 关于时间复杂度,不要被python语言迷惑了,看起来简单的一个函数,时间复杂度并不低。
- 返回值本身就留有空间,所以不算额外使用的。但是不能先给返回值申请别的空间,比如变成set,然后再转换这种就不行,因为生成新的对象,就会在别的地址空间上面进行操作。
师父提供的答案:
class Solution:
def findDisappearedNumbers(self, nums: List[int]) -> List[int]:
res = []
for index, data in enumerate(nums):
if nums[abs(data) - 1] > 0 :
nums[abs(data) - 1] *= -1
for index, data in enumerate(nums):
if data > 0:
res.append(index + 1)
return res