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];
        }
    }
};

 

posted @ 2021-09-17 10:42  rookie_Acmer  阅读(39)  评论(0)    收藏  举报