返回

找出序列中缺失的数字——第 268 号 LeetCode 算法题解

前端

导语:
算法题是程序员必备的基本功之一。本篇博文将带领大家深入浅出地剖析一道简单却又经典的 LeetCode 算法题,第 268 号问题:缺失数字。让我们一同领略算法之美,锻炼编程思维。

题目解析

给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。

思路分析

本题提供了数组中存在 0 .. n 中所有数字的线索,因此我们可以利用这一特性来解决问题。具体来说,我们可以采用以下两种思路:

方案一:哈希表法

  1. 创建一个哈希表,并初始化为 {0: False, 1: False, ..., n: False}。
  2. 遍历数组,对于每个元素,将对应的哈希表项标记为 True。
  3. 遍历哈希表,找出值为 False 的项,其对应的数字即为缺失数字。

方案二:位运算法

  1. 将所有数字进行位运算 XOR,即 num1 XOR num2 XOR ... XOR numN。
  2. 将所有应该存在的数字进行位运算 XOR,即 0 XOR 1 XOR ... XOR n。
  3. 将这两次 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 文章