leetcode 421. Maximum XOR of Two Numbers in an Array

struct TrieNode{
    int num;
    bool isend;
    vector<TrieNode*> children;
    TrieNode():isend(false), num(-1), children({nullptr, nullptr}) {}
};

struct Trie{
    TrieNode* root;
    Trie() : root(nullptr) {}
    void build(vector<int>& nums)
    {
        root = new TrieNode();
        for(int num : nums)
        {
            TrieNode* cur = root;
            for(int i = 31; i >= 0; i--)
            {
                int bit = (num >> i) & 1;
                if(cur->children[bit] == NULL) cur->children[bit] = new TrieNode();
                cur = cur->children[bit];
            }
            cur->isend = true;
            cur->num = num;
        }
    }
};

class Solution {
public:
    int findMaximumXOR(vector<int>& nums) {
        Trie* tt = new Trie();
        tt->build(nums);
        int mx = 0;
        for(int num : nums)
        {
            TrieNode* cur = tt->root;
            for(int i = 31; i >= 0; i--)
            {
                int bit = (num >> i) & 1;
                if(cur->children[1 - bit] != nullptr) cur = cur->children[1 - bit];
                else cur = cur->children[bit]; 
            }
            mx = max(mx, num ^ cur->num);
        }
        return mx;
    }
};

https://leetcode-cn.com/problems/maximum-xor-of-two-numbers-in-an-array/submissions/

这道题还挺有意思的。O(N)时间找出数组中两个数异或值最大。两个值异或值最大,就说明比特位要尽量不一样。而且高位比低位重要。所以所有的数根据从高到低比特位建成一颗trie树。查找的时候对于每个数字。从高位到低位就要尽量找bit位不一样的,也就是1-bit方向的数字。最后的结果就是数组中和该数比特位差别最大的另外一个数。

发布了44 篇原创文章 · 获赞 0 · 访问量 959

猜你喜欢

转载自blog.csdn.net/weixin_37748689/article/details/102749475