LeetCode 421. 數組中兩個數的最大異或值 (01Trie的入門題)

數組中兩個數的最大異或值

class Solution {
public:
    vector<vector<int>> trie;
    int ans = 0,tot = 1;
    int findMaximumXOR(vector<int>& nums) {
        trie.resize(nums.size()*32,vector<int>(2,0));
        for(int x:nums){
            insert(x);
        }

        for(int x:nums){
            ask(x);
        }
        return ans;
    }

    void insert(int x){
        int p = 1;
        for(int i=30;i>=0;i--){
            int id = (x>>i)&1;
            if(!trie[p][id]){
                trie[p][id] = ++tot;
            }
            p = trie[p][id];
        }
    }

    void ask(int x){
        int sum = 0;
        int p = 1;
        for(int i=30;i>=0;i--){
            int id = (x>>i)&1;
            if(trie[p][!id]){
                sum = (sum<<1)|1;
                p = trie[p][!id];
            }else{
                sum <<= 1;
                p = trie[p][id];
            }
        }
        ans = max(ans,sum);
    }
};

換種字典樹的實現方式:

class Solution {
    struct Node{
        Node* children[2] = {0};
    };
    Node *root = new Node;
    void insert(int x){
        Node* p = root;
        for(int i=30;i>=0;i--){
            int id = (x>>i)&1;
            if(!p->children[id]){
                p->children[id] = new Node;
            }
            p = p->children[id];
        }
    }

    int ask(int x){
        int sum = 0;
        Node* p= root;
        for(int i=30;i>=0;i--){
            int id = (x>>i)&1;
            if(p->children[!id]){
                sum = (sum<<1)|1;
                p = p->children[!id];
            }else{
                sum<<=1;
                p = p->children[id];
            }
        }
        return sum;
    }

public:
    int findMaximumXOR(vector<int>& nums) {
        int ans = 0;
        for(int x:nums){
            insert(x);
        }
        for(int x:nums){
            ans = max(ans,ask(x));
        }
        return ans;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章