Bootstrap

leetcode:421. 数组中两个数的最大异或值

题目来源

题目描述

在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    int findMaximumXOR(vector<int>& nums) {

    }
};

题目解析

因为1<=nums.length < 2 ∗ 1 0 4 2 * 10^4 2104,又因为指令数最大 1 0 8 10^8 108

  • 如果算法的时间复杂度为O(N^2),那么指令数4 * 10^8,那么会超时
  • 也就是必须用O(N)或者O(N*logN)的算法

怎么办呢?可以用前缀数的方法,具体解析看算法:最大子数组异或和,它们之间的唯一区别是之前是将异或和加入前缀树,这里直接把数组加入到结构里

#include <memory>
struct TrieNode {
    std::vector<std::shared_ptr<TrieNode>> next;
    explicit TrieNode() : next(2, NULL){
    }
};

class NumTrie{
    std::shared_ptr<TrieNode> head = std::make_shared<TrieNode>();
public:
    void add(int num){
        auto curr = head;
        for (int i = 31; i >= 0; --i) {
            int path = (num >> i) & 1;
            curr->next[path] = curr->next[path] == nullptr ?   std::make_shared<TrieNode>() : curr->next[path];
            curr = curr->next[path];
        }
    }

    int maxXor(int num){
        int ans = 0;
        auto curr = head;
        for (int i = 31; i >= 0; --i){
            int path = (num >> i) & 1;
            int best = i == 31 ? path : path ^ 1;
            best = curr->next[best] == nullptr ? best ^ 1 : best;
            curr = curr->next[best];
            ans |= ((path ^ best) << i);
        }
        return ans;
    }
};
class Solution {
public:
    int findMaximumXOR(vector<int>& nums) {
        if(nums.empty()){
            return 0;
        }

        // 0 ≤ i ≤ j < n
        int max = INT32_MIN;
        NumTrie numTrie;
        for (int num : nums) {
            numTrie.add(num);
            max = std::max(max, numTrie.maxXor(num));
        }
        return max;
    }
};

在这里插入图片描述

;