題目:給定乙個陣列,包含從 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 輸...