Maximum XOR of Two Numbers in an Array

题目来源
感觉很巧妙的一道题,一个数组中,任取两个元素,求最大的异或和,要求O(n)的做法。我这种渣渣只能想到n方的做法…
看了好久答案才理解。
首先了解一个知识点,假如

A XOR B = C then
A XOR C = B and 
B XOR C = A

然后整数类型最多31位,所以从高往低,用&操作来截取高位,然后通过上面这个知识点来判断当前位是否存在两个数异或使得当前位为1,并且高位的那些还是保持原来的。

class Solution {
public:
    int findMaximumXOR(vector<int>& nums) {
        int mask = 0, maximum = 0;
        for (int i=31; i>=0; i--) {
            mask |= 1 << i;
            unordered_set<int> prefixs;
            for (auto num : nums)
                prefixs.insert(num & mask);
            int tmp = maximum | 1 << i;
            for (auto prefix : prefixs)
                if (prefixs.count(tmp ^ prefix)) {
                    maximum = tmp;
                    break;
                }
        }
        return maximum;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容