📜  在包含从1到N的元素的数组中找到四个缺失的数字(1)

📅  最后修改于: 2023-12-03 15:37:40.559000             🧑  作者: Mango

在包含从1到N的元素的数组中找到四个缺失的数字

在一个从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)$。