如何实现数组中两个数的最大异或值
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,本篇内容介绍了"如何实现数组中两个数的最大异或值"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!数组中
千家信息网最后更新 2025年01月19日如何实现数组中两个数的最大异或值
本篇内容介绍了"如何实现数组中两个数的最大异或值"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
数组中两个数的最大异或值
给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n 。
进阶:你可以在 O(n) 的时间解决这个问题吗?
提示:
1 <= nums.length <= 2 * 104
0 <= nums[i] <= 231 - 1
链接:https://leetcode-cn.com/problems/maximum-xor-of-two-numbers-in-an-array
示例 1:
输入:nums = [3,10,5,25,2,8]输出:28解释:最大运算结果是 5 XOR 25 = 28.
示例 2:
输入:nums = [0]输出:0
XOR : 异或运算,1^1=0, 0^0=0, 1^0=1, 0^1=1
// 普通 : O(n^2) 双重循环,解决class Solution { public int findMaximumXOR(int[] nums) { if(nums == null || nums.length <=1){ return 0; } int len = nums.length; int res = 0; int n = 0; for(int i=0;ires){ res = n; } } } return res; }}
// 进阶 :O(n) : 字典树+贪心class Tire{ // 树节点,左节点为0,右节点为1 Tire left = null; // 0 Tire right = null; // 1}class Solution { static Tire root = new Tire(); static final int TIRE_HIGHT = 30; // 树的深度,2^31 - 1,个人认为是31,当30就能满足条件 public int findMaximumXOR(int[] nums) { root = new Tire(); // Leetcode中全局变量的问题,需要自己初始化 if(nums == null || nums.length <=1){ return 0; } int len = nums.length; int res = 0; for(int num:nums) { add(num); res = Math.max(res, check(num)); } return res; } // 生成树,关键:bit =(num>>i)&1,从高位开始构建树,高位越高,ROX才越大。 public static void add(int num) { Tire node = root; for (int i = TIRE_HIGHT; i >= 0; i--) { int bit = (num >> i)&1; if (bit == 0) { if(node.left == null) { node.left = new Tire(); } node = node.left; }else { if (node.right == null) { node.right = new Tire(); } node = node.right; } } } // 贪心算法计算ROX,num某位是1,则找0;反之,找1. public static int check(int num) { Tire node = root; int x = 0; for (int i = TIRE_HIGHT; i >= 0; i--) { int bit = (num >> i)&1; if (bit==0) { if (node.right != null) { node = node.right; x = (x << 1) + 1; }else { node = node.left; x = (x << 1); } }else { if(node.left != null) { node = node.left; x = (x << 1) + 1; }else { node = node.right; x = (x << 1); } } } return x; }}
总结:在数组中找异或值,通过0,1构建树。最大异或值:从高位开始找,通过贪心的思想该位置的异或值等于1最优。
"如何实现数组中两个数的最大异或值"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
最大
数组
两个
节点
高位
输出
运算
内容
更多
知识
示例
结果
问题
进阶
输入
实用
普通
学有所成
接下来
个人
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
食品药品监督局数据库
软件开发总监面试题
cmu数据库发展方向
丰台区运营网络技术咨询市场报价
哪部分是网络安全的中心
扬州软件开发咨询报价
嘉定区技术软件开发服务电话
平顶山学习软件开发
战地1pc和ps版服务器互通吗
食品网络安全手抄报
高新区网络安全科技馆开关门时间
js获得谷歌地图数据库
济宁软件开发便宜
南京触科软件开发有限公司
电脑上的网络安全密钥怎么查找
上海电商软件开发销售价格
服务器多网卡 linux
华为5g 网络技术专题
应用软件开发工资怎么样
海康服务器如何调时间
服务器怎么安装依赖包
我的世界制作饥荒游戏服务器
计算机软件开发助理岗位职责
宜宾学院网络安全法
内蒙古专业软件开发价格服务标准
海康威视修改服务器提示参数错误
数据库第一行代码
数据库时间戳有多少位
青岛海捷软件开发
网络安全宣传周知多少