421. Maximum XOR of Two Numbers in an Array
題目網址:https://leetcode.cn/problems/maximum-xor-of-two-numbers-in-an-array/
題意:給一整數 array
nums
, 返回nums[i] XOR nums[j]
的最大值, 其中0 ≤ i ≤ j < n
。進階:設計 $O(n)$ time 的演算法。
Solution:
想法:利用 Greedy + Trie
Greedy:若今天有一數
x = 5
, 其 binary 形式為0101
- 若跟其 bit 完全相反的
1010
存在, 則 XOR 值最大- 若
1010
不存在, 我們也希望能挑選最左 bit = 1 (因為此時 5 的最左 bit = 0)的數, 並將最左 bit = 0 的數給剔除掉, 然後往下一個 bit 重複此步驟- 透過逐步篩選, 最後挑出所有數中 XOR 值最大的數
首先, 將所有
num
的 binary 形式(由左至右) insert 到 trie 中e.g.
num = 4
則 insert 到 trie 中會是下圖的樣子
然後根據每一個
num
去找其 XOR 最大的數, 每次需花費 $O(32*2)$
class TrieNode { |
- time:$O(n)$ ➔ $O(64n)$
- search 一個 32-bit 的數, 每一個 bit 最多需 $O(2)$, 因為若 flip bit 不存在, 則要拜訪另一個
- space:$O(n)$ ➔ $O(64n)$
- 每 insert 一個數(32 bit), trie 最多產生
32
個 node, 而每個 node 又有2
個 child
- 每 insert 一個數(32 bit), trie 最多產生
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論