两个数组之间的最大异或|特里

问题描述

给定两个整数向量 A 和 B,我们必须从每个向量中选择一个元素,使得它们的 xor 最大,我们需要从函数 int 中返回这个最大的 xor 值::solve(vector &A,vector &B).

我发现下面的代码没有通过所有测试用例 当我在类 Trienode 正下方全局声明和初始化头指针时。这是为什么?

代码

class Trienode
{
    public:
        Trienode* left;
        Trienode* right;

        Trienode()
        {
            left=0;
            right=0;
        }
};

// Trienode* head = new Trienode;


int Max_Xor_Pair(Trienode* head,vector<int> B)
{
    int n=B.size();
    int max_xor=INT_MIN;

    for(int i=0; i<n; i++)
    {
        int pair1 = B[i];
        int pair2 = 0;
        Trienode* curr=head;

        for(int j=31; j>=0; j--)
        {
            int bit = (pair1>>j)&1;

            if(bit)
            {
                if(curr->left)
                    curr=curr->left;
                else
                {
                    curr=curr->right;
                    pair2 += pow(2,j);
                }
                    
            }
            else
            {
                if(curr->right)
                {
                    curr=curr->right;
                    pair2 += pow(2,j);
                }
                else
                    curr=curr->left;
            }

        }

        int curr_xor = pair1 ^ pair2;
        max_xor = max(max_xor,curr_xor);
    }
    
    return max_xor;
}

void Insert(Trienode* head,int num)
{
    Trienode* curr=head;
    for(int i=31; i>=0; i--)
    {
        int x = num;
        int bit= (x>>i)&1;

        if(bit)
        {
            if(!curr->right)
            {
                Trienode* temp = new Trienode;
                curr->right=temp;
            }
            curr=curr->right;            
        }
        else
        {
            if(!curr->left)
            {
                Trienode* temp = new Trienode;
                curr->left=temp;
            }
            curr=curr->left;            
        }
    }
}


int Solution::solve(vector<int> &A,vector<int> &B) {

    Trienode* head = new Trienode;

    for(int x:A)
        Insert(head,x);

    return Max_Xor_Pair(head,B);
}

样本输入

A : [ 15891,6730,24371,15351,15007,31102,24394,3549,19630,12624,24085,7,197,197 7377,13932,26309,16945,32440,24627,11324,5538,21539,16119,2083,22930,16542,4834,31116,4640,29659,22705,9931,13978,2307,31674,22387,5022,28746, 26925、19073、6271、5830、26778、15574、5098、16513、23987、13291、9162 ]

B : [ 18637,22356,24768,23656,15575,4032,12053,27351,1151,16942 ]

解决方法

head 是一个全局变量,而您在 Solution::solve 中没有这一行时:

 Trienode* head = new Trienode;

...then head 将在第一个测试用例完成后保留其值,因此第二个测试用例不会以空树开始。每个测试用例将添加更多节点到一个树。当然,这意味着,除了第一个测试用例,以 head 为根的树不是预期的树。

要使具有全局变量的版本正常工作,请在 Solution::solve重置

head->left = head->right = nullptr;

顺便说一句,您还应该在 nullptr 构造函数中使用 TrieNode(而不是 0)初始化这些成员。这更好地反映了意图