📅  最后修改于: 2023-12-03 15:37:40.559000             🧑  作者: Mango
在一个从1到N的元素范围内,有一些数字缺失了,如何找到这些缺失的数字呢?
最简单的方法是遍历整个数组,对于在范围内但不在数组中出现的数字即为缺失的数字。时间复杂度为$O(N^2)$。
def find_missing_numbers(nums):
res = []
N = len(nums)
for i in range(1, N+1):
if i not in nums:
res.append(i)
return res
上述代码片段的时间复杂度为$O(N^2)$。
使用哈希表存储数组中的数字,然后遍历1~N的整数,查看是否出现在哈希表中,如果没有出现,则为缺失数字。时间复杂度为$O(N)$。
def find_missing_numbers(nums):
num_set = set(nums)
res = []
N = len(nums)
for i in range(1, N+1):
if i not in num_set:
res.append(i)
return res
上述代码片段的时间复杂度为$O(N)$。
根据等差数列的求和公式,计算整个范围内数字的总和,然后减去数组中数字的总和,即可得到缺失的数字之和。再根据等差数列的求和公式,可以计算出缺失数字的平方和、立方和和四次方和。然后使用方程组求解即可得到缺失数字。时间复杂度为$O(N)$。
def find_missing_numbers(nums):
N = len(nums) + 4
total_sum = N*(N+1)//2
nums_sum = sum(nums)
total_square_sum = N*(N+1)*(2*N+1)//6
nums_square_sum = sum([i**2 for i in nums])
total_cube_sum = (N**2)*((N+1)**2)//4
nums_cube_sum = sum([i**3 for i in nums])
# 计算四次方和缺失数字之和
X = total_sum - nums_sum
Y = total_square_sum - nums_square_sum
Z = total_cube_sum - nums_cube_sum
W = ((X**4 - 6*X**2*Y + 3*X*Z + 8*X*Y - 6*X*nums_square_sum + 3*(N-nums_sum)*nums_square_sum + 6*nums_sum*nums_cube_sum - 4*(N-nums_sum)*nums_cube_sum)//4)//(N-nums_sum)
res = [X - i for i in [W, W**2, W**3, W**4]]
return res
上述代码片段的时间复杂度为$O(N)$。