給定一個非空數組,數組中元素爲 a0, a1, a2, … , an-1,其中 0 ≤ ai < 2^31 。css
找到 ai 和aj 最大的異或 (XOR) 運算結果,其中0 ≤ i, j < n 。數組
你能在O(n)的時間解決這個問題嗎?ui
class Solution { public: int Max_xor=-1; string numToBinaryString(int n){ string res=""; for(int i=0;i<31;i++){ if(( n & 1 )== 0)res="0"+res; else res="1"+res; n = n >> 1; } return res; } void MXOR(TreeNode* p, TreeNode* q,int k){ if(p->val+q->val==1)k = k << 1 | 1; else k = k << 1; int c1=(p->left!=NULL)+(p->right!=NULL),c2=(q->left!=NULL)+(q->right!=NULL); if(c1==0&&c2==0){ Max_xor=max(Max_xor,k); return; } if(c1==2&&c2==2){ MXOR(p->left,q->right,k); MXOR(p->right,q->left,k); } else if(c1==2&&c2==1){ if(q->left) MXOR(p->right,q->left,k); else MXOR(p->left,q->right,k); } else if(c1==1&&c2==2){ if(p->left) MXOR(p->left,q->right,k); else MXOR(p->right,q->left,k); } else{ TreeNode* a=p->left==NULL?p->right:p->left; TreeNode* b=q->left==NULL?q->right:q->left; MXOR(a,b,k); } } int findMaximumXOR(vector<int>& nums) { TreeNode* root=new TreeNode(0); TreeNode* p; for(int i=0;i<nums.size();i++){ string res=numToBinaryString(nums[i]); p=root; int k=0; for(int j=0;j<res.length();j++){ if(res[j]=='0'){ if(p->left==NULL){ TreeNode* tmp=new TreeNode(0); p->left=tmp; } p=p->left; } else{ if(p->right==NULL){ TreeNode* tmp=new TreeNode(1); p->right=tmp; } p=p->right; } } } int k=0; while((!root->left||!root->right)&&(root->left||root->right)){ if(!root->left){ root=root->right; } else{ root=root->left; } } if(root->left==NULL&&root->right==NULL)return 0; MXOR(root->left, root->right,0); return Max_xor; } };