题目
给定一个包含[0, n]中n个数的数组nums,找出[0, n]这个范围内没有出现在数组中的那个数。
进阶:
- 能否实现线性时间复杂度、仅使用额外阐述空间的算法解决此问题?
思路
思路一:排序后扫描整个数组
class Solution:
def missingNumber(self, nums):
nums.sort()
# Ensure that n is at the last index
if nums[-1] != len(nums):
return len(nums)
# Ensure that 0 is at the first index
elif nums[0] != 0:
return 0
# If we get here, then the missing number is on the range (0, n)
for i in range(1, len(nums)):
expected_num = nums[i-1] + 1
if nums[i] != expected_num:
return expected_num
class Solution:
def missingNumber(self, nums: List[int]) -> int:
nums.sort()
for i, num in enumerate(nums):
if i != num:
return i
return len(nums)
思路二:哈希表
可以直接查询每个数是否在数组中出现过来找出缺失的数字。如果使用哈希表,那么每一次查询操作都是常数时间的。
class Solution:
def missingNumber(self, nums):
num_set = set(nums)
n = len(nums) + 1
for number in range(n):
if number not in num_set:
return number
思路三:位运算
- 异或:不同为1,相同为0。
- 0异或任何数都为任何数。
- 异或运算(XOR):对一个数进行两次完全相同的异或运算会得到原来的数。a 异或 b 异或 b = a 异或 0 = a
class Solution:
def missingNumber(self, nums):
missing = len(nums)
for i, num in enumerate(nums):
missing ^= i ^ num
return missing
思路四:数学
class Solution:
def missingNumber(self, nums):
expected_sum = len(nums)*(len(nums)+1)//2
actual_sum = sum(nums)
return expected_sum - actual_sum