日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 421. 数组中两个数的最大异或值(Trie树)

發布時間:2024/7/5 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 421. 数组中两个数的最大异或值(Trie树) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 題目

給定一個非空數組,數組中元素為 a0, a1, a2, … , an-1,其中 0 ≤ ai < 231

找到 ai 和aj 最大的異或 (XOR) 運算結果,其中0 ≤ i, j < n 。

你能在O(n)的時間解決這個問題嗎?

示例:輸入: [3, 10, 5, 25, 2, 8]輸出: 28解釋: 最大的結果是 5 ^ 25 = 28.

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/maximum-xor-of-two-numbers-in-an-array
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. Tries樹

  • 題目要求O(n)時間復雜度,兩兩異或O(n2)
  • 考慮將每個數字的二進制位插入Trie樹(從高位往低位插入)O(n)
  • 再遍歷每個數字bit,貪心從trie樹的異或最大路徑往下走,得到一個val,取val的最大值,O(n)時間復雜度
class Node { public:int val;Node *next[2];Node(int v = 0):val(v) {next[0] = next[1] = NULL;} }; class Trie { public:Node *root;Trie(){root = new Node();}~Trie()//析構釋放內存{destroy(root);}void destroy(Node *root){if(root == NULL)return;destroy(root->next[0]);destroy(root->next[1]);delete root;}void insert(int n)//插入數字的二進制位{Node *cur = root;int bit;for(int i = 31; i >= 0; --i){bit = (n>>i) & 1;if(cur->next[bit] == NULL)cur->next[bit] = new Node(bit);cur = cur->next[bit];}}int MaxXOR(int n){Node *cur = root;int val = 0, bit, anotherBit;for(int i = 31; i >= 0; --i){bit = (n>>i) & 1;anotherBit = bit^1;//取反if(cur->next[anotherBit]){val += (1<<i);cur = cur->next[anotherBit];}elsecur = cur->next[bit];}return val;} }; class Solution { public:int findMaximumXOR(vector<int>& nums) {Trie tree;int ans = INT_MIN;for(int n:nums)tree.insert(n);for(int n:nums)ans = max(ans,tree.MaxXOR(n)); return ans;} };

總結

以上是生活随笔為你收集整理的LeetCode 421. 数组中两个数的最大异或值(Trie树)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。