給定乙個非空陣列,陣列中元素為 a0, a1, a2, … , an-1,其中 0 ≤ ai < 231 。
找到 ai 和aj 最大的異或 (xor) 運算結果,其中0 ≤ i, j < n 。
你能在o(n)的時間解決這個問題嗎?
示例:
輸入:[3
,10,5
,25,2
,8]輸出:
28解釋: 最大的結果是 5^25
=28.
構建乙個字典樹(深度是31,即二進位制數字的最高位數),首先遍歷陣列,生成該字典樹。生成方式:對於當前數字num,從高位向低位計算,如果(num>>i)&1=true,表示該位置是1,生成右子樹,反之生成左子樹。
注:遍歷陣列,時間為o(n),每個數字生成字典樹是常量時間(一共就31位),因此生成字典樹的時間複雜度為o(n)。
字典樹生成後,遍歷陣列;對於當前數字num,仍然從高位向低位計算(因為我們想讓異或結果最大, 因此應該從高位開始比較)。
注:字典樹是根據整個陣列生成的,因此root在字典樹中移動的時候,對應的是陣列中的某個數字,符合題意;
// 字典樹
struct trieroot
;class
solution
else}}
public
:int
findmaximumxor
(vector<
int>
& nums)
int res =
0, tmp =0;
trieroot * curnode = root;
// 計算每個數字在陣列中的最大異或值
for(
int i =
0; i < nums.
size()
++i)
else
curnode = curnode-
>right;
}else
else
curnode = curnode-
>left;}}
res =
max(res, tmp);}
return res;}}
;
LeetCode421 陣列中兩個數的最大異或值
目錄 一 題目描述 二 解題思路 三 實現 給定乙個非空陣列,陣列中元素為 a0,a1,a2,an 1,其中 0 ai 231 找到 ai 和aj 最大的異或 xor 運算結果,其中0 i,j n 你能在o n 的時間解決這個問題嗎?示例 輸入 3,10,5,25,2,8 輸出 28 解釋 最大的結...
421 陣列中兩個數的最大異或值
標籤 位運算 字典樹。題目 給你乙個整數陣列 nums 返回 nums i xor nums j 的最大運算結果,其中 0 i j n 高階 你可以在 o n 的時間解決這個問題嗎?輸入 nums 3 10,5 25,2 8 輸出 28 解釋 最大運算結果是 5 xor 25 28.輸入 nums ...
《疑問》Leetcode 陣列 兩數之和
題目 給定乙個整數陣列 nums 和乙個整數目標值 target,請你在該陣列中找出 和為目標值 的那 兩個 整數,並返回它們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。你可以按任意順序返回答案。示例 1 輸入 nums 2,7,11,15 target 9 ...