消失的兩個數字 LeetCode

2021-10-25 20:05:02 字數 1346 閱讀 5195

題目:給定乙個陣列,包含從 1 到 n 所有的整數,但其中缺了兩個數字。你能在 o(n) 時間內只用 o(1) 的空間找到它們嗎?

以任意順序返回這兩個數字均可

方法一:求和法

思路:首先,算出如果沒有缺少數字的情況下整個陣列的和sum,與當前缺少數字的陣列的和相減,得到缺少的兩個數字的和double_sum,根據題目的要求,可得這兩個數字並不相同,那麼必然乙個小於等於double_sum/2,另乙個大於double_sum/2,然後在當前陣列中再利用上述方法找到缺少較小的數,即可得出另乙個較大的數。

示例**

vector<

int>

missingtwo

(vector<

int>

& nums)

int double_sum = n*

(n+1)/

2- sum;

//缺少的兩個數字的和

int limit = double_sum/2;

//所缺兩個數字的中值

sum =0;

for(

auto a:nums)

}int first = limit*

(limit+1)

/2-sum;

int second = double_sum-first;

return

;}

方法二:異或法

思路:0 ^ x = x,0 ^ x ^ x = 0,首先把沒有缺少數字的陣列中的所有元素異或儲存結果為ans,然後讓ans和當前缺少數字的陣列挨個異或,得到結果為缺少的兩個數字的異或結果,ans的2進製形式中,為1的位即為兩個數字不同的二進位制位,用lowbit函式得到ans最低二進位制位為1的位置,所以把所有數字分為兩組,一組是lowbit和ans的lowbit是一樣的數字,一組是不同的,那麼缺少的兩個數字必然分別在這兩組數字中。再利用上述方法,在每一組中找出缺少的數字。

有關lowbit見:

vector<

int>

missingtwo

(vector<

int>

& nums)

for(

auto a:nums)

int lowbit = ans &

-ans;

//int first =

0, second =0;

for(

int i=

1;i<=n+

2;i++)}

for(

auto a:nums)

} second = ans ^ first;

return

;}

題解 消失的兩個數字

給定乙個陣列,包含從 1 到 n 所有的整數,但其中缺了兩個數字。你能在 o n 時間內只用 o 1 的空間找到它們嗎?以任意順序返回這兩個數字均可。示例1 輸入 1 輸出 2,3 示例2 輸入 2,3 輸出 1,4 已知陣列nums中元素的最小值為1,最大值為nums.size 2。先給nums新...

python 消失的兩個數字

給定乙個陣列,包含從 1 到 n 所有的整數,但其中缺了兩個數字。你能在 o n 時間內只用 o 1 的空間找到它們嗎?以任意順序返回這兩個數字均可。示例 1 輸入 1 輸出 2,3 示例 2 輸入 2,3 輸出 1,4 nums.length 30000一 數學方法 以兩數之和的平均值為界,乙個在...

Leetcode 和為s的兩個數字

輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得它們的和正好是s。如果有多對數字的和等於s,則輸出任意一對即可。示例 1 輸入 nums 2,7,11,15 target 9 輸出 2,7 或者 7,2 示例 2 輸入 nums 10,26,30,31,47,60 target 40 輸...