返回
找出序列中缺失的数字——第 268 号 LeetCode 算法题解
前端
2023-09-08 21:56:59
导语:
算法题是程序员必备的基本功之一。本篇博文将带领大家深入浅出地剖析一道简单却又经典的 LeetCode 算法题,第 268 号问题:缺失数字。让我们一同领略算法之美,锻炼编程思维。
题目解析
给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。
思路分析
本题提供了数组中存在 0 .. n 中所有数字的线索,因此我们可以利用这一特性来解决问题。具体来说,我们可以采用以下两种思路:
方案一:哈希表法
- 创建一个哈希表,并初始化为 {0: False, 1: False, ..., n: False}。
- 遍历数组,对于每个元素,将对应的哈希表项标记为 True。
- 遍历哈希表,找出值为 False 的项,其对应的数字即为缺失数字。
方案二:位运算法
- 将所有数字进行位运算 XOR,即 num1 XOR num2 XOR ... XOR numN。
- 将所有应该存在的数字进行位运算 XOR,即 0 XOR 1 XOR ... XOR n。
- 将这两次 XOR 的结果再进行 XOR,得到的即为缺失数字。
代码实现
方案一:哈希表法
def missing_number(nums):
hashmap = {i: False for i in range(len(nums) + 1)}
for num in nums:
hashmap[num] = True
for key, val in hashmap.items():
if not val:
return key
方案二:位运算法
def missing_number(nums):
missing = 0
for i in range(len(nums) + 1):
missing ^= i
for num in nums:
missing ^= num
return missing
复杂度分析
哈希表法:
- 时间复杂度:O(n),其中 n 为数组长度。
- 空间复杂度:O(n)。
位运算法:
- 时间复杂度:O(n),其中 n 为数组长度。
- 空间复杂度:O(1)。
总结
缺失数字问题看似简单,但它考察了我们对数组和位运算的理解。通过对题目进行深入分析,我们提出了两种不同的解决方案,各有千秋。掌握这些解法将有助于我们应对类似算法难题,提升编程能力。
SEO 文章