給定乙個陣列,包含從 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 :
return ans
題解 消失的兩個數字
給定乙個陣列,包含從 1 到 n 所有的整數,但其中缺了兩個數字。你能在 o n 時間內只用 o 1 的空間找到它們嗎?以任意順序返回這兩個數字均可。示例1 輸入 1 輸出 2,3 示例2 輸入 2,3 輸出 1,4 已知陣列nums中元素的最小值為1,最大值為nums.size 2。先給nums新...
消失的兩個數字 LeetCode
題目 給定乙個陣列,包含從 1 到 n 所有的整數,但其中缺了兩個數字。你能在 o n 時間內只用 o 1 的空間找到它們嗎?以任意順序返回這兩個數字均可 方法一 求和法 思路 首先,算出如果沒有缺少數字的情況下整個陣列的和sum,與當前缺少數字的陣列的和相減,得到缺少的兩個數字的和double s...
兩個數字相加
兩個數字相加 題幹 給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3...