📅  最后修改于: 2023-12-03 15:12:37.814000             🧑  作者: Mango
在 GATE CS 2021 的设置 2 中,问题 23 是一个关于查找数组中缺失数字的问题。本题要求使用两种不同的方法实现。
给定一个长度为 n 的无序整数数组,其中的数字范围在 [1, n] 之间,数组中有且只有一个数字缺失。请编写程序查找缺失的数字。
首先算出原数组中所有数字的和,然后再算出 [1, n] 范围内所有数字的和,两者相减就是缺失的数字。
def find_missing_number(arr):
n = len(arr)
expected_sum = (n + 1) * (n + 2) // 2
actual_sum = sum(arr)
return expected_sum - actual_sum
这个算法的时间复杂度为 O(n),由于只需要遍历数组一次,所以空间复杂度为 O(1)。
对原数组排序后,遍历数组找到第一个不连续的数字,其下标即为缺失的数字。
def find_missing_number(arr):
arr.sort()
for i, num in enumerate(arr):
if i + 1 != num:
return i + 1
这个算法的时间复杂度为 O(n log n),由于需要排序,所以空间复杂度为 O(n)。
本题给出两种不同的算法实现,其中第一种算法更快,但需要算出所有数字的和;第二种算法则需要排序,但是在空间复杂度上比第一种算法更弱。根据具体情况可以选择不同的算法。