给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗?
以任意顺序返回这两个数字均可。
示例 1:
输入: [1]
输出: [2,3]
示例 2:
输入: [2,3]
输出: [1,4]
提示:
nums.length <= 30000
一、数学方法
以两数之和的平均值为界,一个在limit左边,一个在limit右边。
class Solution:
def missingTwo(self, nums: List[int]) -> List[int]:
n = len(nums) + 2
nums_sum = 0
for i in nums:
nums_sum += i
N_sum = n * (n + 1)//2 - nums_sum
limits = N_sum // 2
nums_sum = 0
for i in nums:
if i <= limits:
nums_sum += i
first = limits * (limits + 1)//2 - nums_sum
return [first, N_sum - first]
二、分组异或
class Solution:
def missingTwo(self, nums: List[int]) -> List[int]:
ans = 0
n = len(nums)
for i in range(1, n+3):
ans ^= i
for i in nums:
ans ^= i
first = 0
diff = ans & -ans
for i in range(1, n+3):
if diff & i:
first ^= i
for i in nums:
if diff & i:
first ^= i
return [first, first^ans]
三、交换数组
class Solution:
def missingTwo(self, nums: List[int]) -> List[int]:
nums += [-1, -1]
for i in range(len(nums)):
while (i+1 != nums[i]) and (nums[i] != -1):
t = nums[i]
nums[i] = nums[t-1]
nums[t-1] = t
ans = []
for i in range(len(nums)):
if nums[i] == -1 :
ans.append(i+1)
return ans