当前位置: 首页 > article >正文

【字典树Trie】个人练习-Leetcode-421. Maximum XOR of Two Numbers in an Array

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

题目大意:给一个数组nums[],求最大的num[i] ^ nums[j]的值

思路:两两异或必然超时,因为二进制位就是0或1,可以用字典树来存储nums[]。往左子树走代表下一位是0,往右子树走代表下一位是1。不过有趣的是主函数中的遍历,可以把nums[0...i-1]存进Trie里,然后用nums[i]去和Trie里的树找对应,得到可能得到的最大值。

完整代码:

class Trie {
public:
    Trie* left = nullptr;
    Trie* right = nullptr;
    Trie() {}
};


class Solution {
public:
    Trie* root = new Trie();
    static constexpr int HIGH_BIT = 30;

    void add(int num) {
        Trie* cur = root;
        for (int k = HIGH_BIT; k >= 0; k--) {
            int bit = (num >> k) & 1;
            if (bit == 0) {
                if (cur->left == nullptr) {
                    cur->left = new Trie();
                }
                cur = cur->left;
            }
            else {
                if (cur->right == nullptr) {
                    cur->right = new Trie();
                }
                cur = cur->right;
            }
        }
    }

    int check(int num) {
        Trie* cur = root;
        int x = 0;
        for (int k = HIGH_BIT; k >= 0; k--) {
            int bit = (num >> k) & 1;
            if (bit == 0) {
                if (cur->right) {
                    cur = cur->right;
                    x = x * 2 + 1;
                }
                else {
                    cur = cur->left;
                    x = x * 2;
                }
            }
            else {
                if (cur->left) {
                    cur = cur->left;
                    x = x * 2 + 1;
                }
                else {
                    cur = cur->right;
                    x = x * 2;
                }
            }
        }
        return x;
    }

    int findMaximumXOR(vector<int>& nums) {
        int n = nums.size();
        int x = 0;
        for (int i = 1; i < n; i++) {
            add(nums[i-1]);
            // now nums[0...i-1] are in Tire
            // let nums[i] be the one to match
            x = max(x, check(nums[i]));
        }
        return x;
    }
};

时间复杂度的话,插入操作是 O ( log ⁡ c ) O(\log c) O(logc),其中 c c c是最大值。一共进行 n n n次插入,复杂度为 O ( n log ⁡ c ) O(n\log c) O(nlogc)。每一次check操作也是如此,因此复杂度为 O ( n log ⁡ c ) O(n\log c) O(nlogc)


http://www.kler.cn/a/394275.html

相关文章:

  • 【机器学习】如何配置anaconda环境(无脑版)
  • Vector 深度复制记录
  • C#文字识别API场景解析、表格识别提取
  • FatLab:我的编程课程系列
  • 冗余连接2 hard题 代随C#写法
  • ML 系列: 第 23 节 — 离散概率分布 (多项式分布)
  • 惠州石湾DELL T130服务器黄灯不开机案例
  • 百度秒哒简介
  • #渗透测试#SRC漏洞挖掘#蓝队基础之网络七层杀伤链02
  • 基于 PyTorch 从零手搓一个GPT Transformer 对话大模型
  • 二、vue指令
  • STM32 Option Bytes(选项字节)
  • 【项目组件】第三方库——websocketpp
  • Flutter 应用在真机上调试的流程
  • 【WiFi】ubuntu20.4 WiFi6 无线抓包环境搭建及使用
  • PostgreSQL 序列字段达到最大值
  • 一文窥见神经网络
  • 【QT常用技术讲解】优化网络链接不上导致qt、qml界面卡顿的问题
  • Easyui ComboBox 数据加载完成之后过滤数据
  • AutoDL远程连接技巧
  • php preg_match 不到内容,修改pcre.backtrack_limit解决问题
  • elementui el-table中给表头 el-table-column 加一个鼠标移入提示说明
  • Android 关于使用videocompressor库压缩没有声音的问题
  • GOF设计模式中各模式支持的可变方面(封装变化)
  • 远程链接mysql步骤
  • UE5.4 PCG 生成藤蔓墙体