LeetCode421 陣列中兩個數的最大異或值

2021-10-17 08:42:21 字數 1204 閱讀 6745

目錄

一、題目描述

二、解題思路

三、**實現

給定乙個非空陣列,陣列中元素為 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.

這題o(n^2)的想法很容易,但是超時也是絕對的。超時的原因在於,我們需要把每個數依次跟其餘所有數進行異或操作才能得到最大值。

如果有一種方法,能讓我們每個數可以同時跟剩餘所有的數同時進行異或操作,那時間複雜度不就是一次遍歷就可以了嗎?

順著這個想法可以想到字典樹,字典樹又叫字首樹。先把每個數字按照二進位制位構建字典樹(此時字典樹是一棵二叉樹),建樹示意圖如下,以下均來自力扣官方題解;

然後把陣列中的每個數同樣按照二進位制位依次去匹配,匹配的過程如下:

因為結果是求最大的異或值,所以:

#include using namespace std;

class node

~node()

}};class solution

~solution()

int findmaximumxor(vector& nums)

p = p->trienode[bit];}}

//分別拿每個數去跟字典樹貪心的進行異或操作

for (int i = 0; i < n; i++)

else

}res = max(res, tmp);

} return res;

}};int main() ;

solution *s = new solution();

cout << s->findmaximumxor(nums);

return 0;

}

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解釋 最大的結果是 5 25 28.構建乙個字典樹 深度是3...

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 ...