leetcode 数组中两个数的最大异或值 中等
01 字典树:对每个数的二进制进行字典树建树,从高位往地位建,然后按照贪心进行答案获取。即如果某个数当前二进制位为 0,则优先考虑字典树中为 1 的下一个结点。。1 反之
class Solution { public: int findMaximumXOR(vector<int>& nums) { trie01[0].resize(nums.size() * 32, 0); trie01[1].resize(nums.size() * 32, 0); for(auto &num : nums) { insert(num); } int ret = 0; for(auto &num : nums) { int p = 0, ans = 0; for(int i = 31; i >= 0; -- i) { int tmp = (num >> i) & 1; if(trie01[tmp ^ 1][p]) { p = trie01[tmp ^ 1][p]; ans |= (1 << i); } else { p = trie01[tmp][p]; } } ret = max(ret, ans); } return ret; } private: vector<int> trie01[2]; int k = 1; void insert(int num) { int p = 0; for(int i = 31; i >= 0; -- i) { // 将 num 二进制逆序插入字典树 int tmp = (num >> i) & 1; if(!trie01[tmp][p]) { trie01[tmp][p] = k ++; } p = trie01[tmp][p]; } } };