trie树-leetcode-421. Maximum XOR of Two Numbers in an Array

来源:互联网 发布:网络程蝶依视频 编辑:程序博客网 时间:2024/06/05 20:32

考察点:trie树,还有一种set方法,思路类似;
思路:首先建立trie字典树,它记录了这些nums中从最高位第32位(脚码是31)开始建立二叉树,只有0,1,建立的时候是对每一个数字,按照从高位到低位的顺序遍历各个位; 然后就是寻找XOR的最大数值了,它是由这颗树root跟nums中的每一个num产生的,对于每一个num,依次将它的每一个位与trie树中的节点比较,若能异或为1,就将ret的该位置为1,否则置为0;

C++代码:

class Solution {public:    struct TrieNode {        TrieNode *child[2];        TrieNode() {            child[0] = NULL;            child[1] = NULL;        }    };    TrieNode *buildTree(vector<int> &nums) {        TrieNode *root = new TrieNode();        TrieNode *cur = NULL;        int n = nums.size();        for (int i=0; i<n; i++) {            cur = root;            for (int j = 31; j>=0; j--) {                int index = ((nums[i]>>j)&1);                if (cur->child[index] == NULL)                    cur->child[index] = new TrieNode();                cur = cur->child[index];            }        }        return root;    }    int help(TrieNode * node, int num) {        int ret = 0;        for (int i=31; i>=0; i--) {            int index = ((num>>i)&1) ? 0 : 1;            if (node->child[index]) {                ret <<= 1;                ret |= 1;                node = node->child[index];            } else {                ret <<= 1;                node = node->child[index ? 0 : 1];            }        }        return ret;    }    int findMaximumXOR(vector<int>& nums) {        int ret = 0;        TrieNode *root = buildTree(nums);        for (int i=0; i<nums.size(); i++) {            ret = max(ret, help(root, nums[i]));        }        return ret;    }};
阅读全文
0 0
原创粉丝点击