【数据结构-异或字典树】力扣421. 数组中两个数的最大异或值

embedded/2025/2/12 15:55:12/

给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n 。

示例 1:
输入:nums = [3,10,5,25,2,8]
输出:28
解释:最大运算结果是 5 XOR 25 = 28.

示例 2:
输入:nums = [14,70,53,83,49,91,36,80,92,51,66,70]
输出:127

在这里插入图片描述

字典树

struct Trie{Trie* left = nullptr;Trie* right = nullptr;Trie(){}
};class Solution {
private:Trie* root = new Trie();static constexpr int HIGH_BIT = 30;public: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 x = 0;for(int j = 1; j < nums.size(); j++){add(nums[j-1]);x = max(x, check(nums[j]));}return x;}
};

时间复杂度:O(nlogC),其中 n 是数组 nums 的长度,C 是数组中的元素范围。

空间复杂度:O(nlogC)。每一个元素在字典树中需要使用 O(logC) 的空间,因此总空间复杂度为 O(nlogC)。

这道题我们可以使用字典树来完成,我们枚举j,然后将nums[0]到nums[j-1]的元素都加入到字典树中。

接着我们将nums[j]传入check函数中来在已经构造的字典树中找到一个最符合的路径。我们使用贪心的思想,我们要让他异或的值最大,那么就要优先在较高的bit位上找出与nums[j]对应比特位相反数值的路径。也就是说在某个比特位上,nums[j]的该比特位是1,也就是代表树中的right,那么我们就要优先走0,也就是left这条路径。如果left路径不存在的话再选择走right路径(由于cur节点存在,那么cur->left或者cur->right必定有一个存在)。只要与nums[j]某比特位相反的节点存在,那么我们就走该子树的路径,由于该比特位会是异或,所以我们的异或值x就要更新为x = x * 2 + 1,如果只存在相同比特位的节点,那么就将x更新为x = x * 2


http://www.ppmy.cn/embedded/161627.html

相关文章

谈谈云计算、DeepSeek和哪吒

我不会硬蹭热点&#xff0c;去分析自己不擅长的跨专业内容&#xff0c;本文谈DeepSeek和哪吒&#xff0c;都是以这两个热点为引子&#xff0c;最终仍然在分析的云计算。 这只是个散文随笔&#xff0c;没有严谨的上下游关联关系&#xff0c;想到哪里就写到哪里。 “人心中的成见…

解决No module named ‘llama_index.llms.huggingface‘

执行下面的脚本&#xff0c;报错No module named llama_index.llms.huggingface’执行下面的脚本&#xff0c;报错No module named llama_index.llms.huggingface’执行下面的脚本&#xff0c;报错No module named llama_index.llms.huggingface’执行下面的脚本&#xff0c;报…

基于Python的人工智能驱动基因组变异算法:设计与应用(下)

3.3.2 数据清洗与预处理 在基因组变异分析中,原始数据往往包含各种噪声和不完整信息,数据清洗与预处理是确保分析结果准确性和可靠性的关键步骤。通过 Python 的相关库和工具,可以有效地去除噪声、填补缺失值、标准化数据等,为后续的分析提供高质量的数据基础。 在基因组…

使用springAI实现图片相识度搜索

类似的功能&#xff1a;淘宝拍照识别商品。图片相识度匹配 实现方式&#xff1a;其实很简单&#xff0c;用springai 将图片转换为向量数据&#xff0c;然后搜索就是先把需要搜索的图片转位向量再用向量数据去向量数据库搜索 但是springai现在不支持多模态嵌入数据库。做了一些…

(14)gdb 笔记(7):以日志记录的方式来调试多进程多线程程序,linux 命令 tail -f 实时跟踪日志

&#xff08;44&#xff09;以日志记录的方式来调试多进程多线程程序 &#xff1a; 这是老师的日志文件&#xff0c;可以用来模仿的模板&#xff1a; &#xff08;45&#xff09;实时追踪日志的 tail -f 命令&#xff1a; &#xff08;46&#xff09; 多种调试方法结合起来用 …

Ajax:重塑Web交互体验的人性化探索

在数字化时代&#xff0c;网页的交互性和响应速度已成为衡量用户体验的关键指标。Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;&#xff0c;作为前端与后端沟通的桥梁&#xff0c;凭借其异步通信的能力&#xff0c;极大地提升了网页的动态性和用户友好度&…

使用 DeepSeek 进行图像描述:多模态 AI 技术实践

使用 DeepSeek 进行图像描述&#xff1a;多模态 AI 技术实践 背景介绍 在当今的人工智能领域&#xff0c;多模态技术正在rapidly发展&#xff0c;为图像理解和描述提供了前所未有的可能性。本文将详细介绍如何使用 DeepSeek 的多模态模型来实现图像智能描述。 技术原理 多模…

【Spring】什么是Spring?

什么是Spring&#xff1f; Spring是一个开源的轻量级框架&#xff0c;是为了简化企业级开发而设计的。我们通常讲的Spring一般指的是Spring Framework。Spring的核心是控制反转(IoC-Inversion of Control)和面向切面编程(AOP-Aspect-Oriented Programming)。这些功能使得开发者…