方案一,直接求解,python代码如下
class Solution:
def missingNumber(self, nums: List[int]) -> int:
return list(set([x for x in range(0,len(nums)+1)])-set(nums))[0]
可以优化为更高效的数学方法(高斯求和)或者位运算方法,避免使用 set
,减少额外的空间开销。
优化方案
from typing import List
class Solution:
def missingNumber(self, nums: List[int]) -> int:
n = len(nums)
return n * (n + 1) // 2 - sum(nums)
优化点
- 时间复杂度: 由
O(N)
(遍历set
)降低到O(N)
(求和运算)。 - 空间复杂度: 由
O(N)
(set
需要额外存储)降低到O(1)
(只使用常数额外空间)。 - 数学方法(高斯求和公式): 计算
0
到n
之间所有数的总和,再减去数组nums
的和,得到缺失的数。
如果你更喜欢 位运算(异或) 方法:
class Solution:
def missingNumber(self, nums: List[int]) -> int:
missing = len(nums)
for i, num in enumerate(nums):
missing ^= i ^ num
return missing
位运算优化点
- 时间复杂度:
O(N)
- 空间复杂度:
O(1)
- 核心思路:
x ^ x = 0
,最终只剩下缺失的那个数字。
这两种方法比 set
操作更高效,推荐使用。