LeetCode 数组中两个数的最大异或值

题目链接:https://leetcode-cn.com/problems/maximum-xor-of-two-numbers-in-an-array/

题目大意:

  略。

分析:

  字典树 + 贪心.

代码如下:

 1 class Trie {
 2 public:
 3     int passed; // 记录经过这个节点的字符串数量
 4     int ends;   // 记录有多少个字符串以这个节点结尾
 5     Trie* nxt[2];
 6     
 7     /** Initialize your data structure here. */
 8     Trie() {
 9         passed = 0;
10         ends = 0;
11         nxt[0] = nxt[1] = NULL;
12     }
13     
14     /** Inserts a word into the trie. */
15     void insert(string word) {
16         Trie* p = this;
17         for(int i = 0; i < word.size(); ++i) {
18             int key = word[i] - '0';
19             
20             if(p->nxt[key] == NULL) {
21                 p->nxt[key] = new Trie();
22             }
23             ++p->passed;
24             p = p->nxt[key];
25         }
26         ++p->ends;
27     }
28     
29     int solve(string word) {
30         int ret = 0;
31         int mask = (1 << 30);
32         
33         Trie* p = this;
34         for(int i = 0; i < word.size(); ++i) {
35             int key = word[i] - '0';
36             
37             if(p->nxt[!key] != NULL) {
38                 ret |= mask;
39                 key = !key;
40             }
41             mask >>= 1;
42             p = p->nxt[key];
43         }
44         return ret;
45     }
46 };
47 
48 
49 class Solution {
50 public:
51     int findMaximumXOR(vector<int>& nums) {
52         Trie trie = Trie();
53         vector< string > bits;
54         int ans = -1;
55         int N = nums.size();
56         
57         for(int i = 0; i < N; ++i) {
58             bits.push_back(bitset< 31 >(nums[i]).to_string());
59             trie.insert(bits[i]);
60         }
61         
62         for(int i = 0; i < N; ++i) {
63             ans = max(ans, trie.solve(bits[i]));
64         }
65         
66         return ans;
67     }
68 };
View Code

 

转载于:https://www.cnblogs.com/zaq19970105/p/11458824.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值