1. 问题描述与解题思路
消失的数字问题要求我们从一个包含0到n所有整数(缺少一个)的数组中找出缺失的那个数字。题目给出了两个示例:
- 输入[3,0,1]时输出2
- 输入[9,6,4,2,3,5,7,0,1]时输出8
这个问题看似简单,但要实现O(n)时间复杂度的解法需要一些巧妙的思路。我将分享四种不同的解决方案,每种都有其独特的思考角度和实现方式。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 四种解法详解
2.1 数学求和法
这是最直观的解法,利用了等差数列求和公式:
python复制def find_miss_sum(nums):
n = len(nums)
total = n * (n + 1) // 2
return total - sum(nums)
原理分析:
- 完整序列0到n的和可以用公式n(n+1)/2计算
- 计算实际数组的和
- 两者之差就是缺失的数字
时间复杂度:O(n),因为需要遍历数组计算sum
空间复杂度:O(1)
注意事项:在Python中不需要担心整数溢出问题,但在其他语言中,当n很大时,n(n+1)可能会溢出,这时可以考虑使用长整型。
2.2 集合差集法
利用Python集合的特性:
python复制def find_miss_set(nums):
return (set(range(len(nums) + 1)) - set(nums)).pop()
原理分析:
- 创建完整的数字集合(0到n)
- 创建输入数组的集合
- 取两者的差集,剩下的就是缺失的数字
时间复杂度:O(n),创建集合需要线性时间
空间复杂度:O(n),需要额外存储集合
实操心得:这种方法代码简洁,但空间开销较大。pop()方法在这里是安全的,因为差集肯定只有一个元素。
2.3 哈希标记法
使用数组作为哈希表:
python复制def find_miss_hash(nums):
hashes = [0] * (len(nums) + 1)
for num in nums:
hashes[num] = 1
return hashes.index(0)
