热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MaximumXORofTwoNumbersinanArray

MaximumXORofTwoNumbersinanArrayGivenanon-emptyarrayofnumbers,a0,a1,a2,…,an-1,where0≤ai

  1. Maximum XOR of Two Numbers in an Array

Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai <231.

Find the maximum result of ai XOR aj, where 0 ≤ i, j

Could you do this in O(n) runtime?

Example:

Input: [3, 10, 5, 25, 2, 8]

Output: 28

Explanation: The maximum result is 5 ^ 25 &#61; 28.

我的代码

class Solution {public int findMaximumXOR(int[] nums) {if (nums.length &#61;&#61; 0) {return 0;}TrieNode root &#61; new TrieNode();// 建树// 每一个数字循环32次&#xff0c;反正输入没有负数// 从最高位开始处理for (int i : nums) {TrieNode node &#61; root;for (int j &#61; 31; j >&#61; 0; j--) {int bit &#61; (i >> j) & 1;if (bit &#61;&#61; 1) {if (node.one &#61;&#61; null) {// one的位置是null&#xff0c;就新建node.one &#61; new TrieNode();}node &#61; node.one;} else {if (node.zero &#61;&#61; null) {node.zero &#61; new TrieNode();}node &#61; node.zero;}}}int max &#61; Integer.MIN_VALUE;//找每一个数字和别的数字异或出来的最大值&#xff01;//所有最大值&#xff0c;取其中最大的for (int i : nums) {TrieNode node &#61; root;int XOR &#61; 0;// 异或结果,的累加。按位累加也是牛逼for (int j &#61; 31; j >&#61; 0; j--) {int bit &#61; (i >> j) & 1;//如果这一位是1&#xff0c;为了异或最大&#xff0c;最好使用0&#xff0c;这样异或出来是1//如果0不存在就只能使用1&#xff0c;这样这一位异或出来就是0//如果这一位是0&#xff0c;为了异或最大&#xff0c;最好使用1&#xff0c;这样异或出来是1//如果1不存在就只能使用0&#xff0c;这样这一位异或出来就是0if (bit &#61;&#61; 1) {if (node.zero !&#61; null) {node &#61; node.zero;XOR &#43;&#61; 1 < XOR ? max : XOR;}return max;}
}class TrieNode {TrieNode zero;TrieNode one;
}

同样思路
trick: 通过预处理得到最大值的首位1&#xff0c;优化了Trie树的深度。

class Solution {TreeNode root &#61; new TreeNode(0);public int findMaximumXOR(int[] nums) {int max &#61; findMax(nums);int maxBit &#61; 32 - Integer.numberOfLeadingZeros(max);//build prefix treeTreeNode currNode &#61; root;for (int i &#61; 0; i &#61;0 ; j--) {int tmp &#61; (nums[i] >>j)& 1;if(tmp &#61;&#61; 0){if(currNode.left &#61;&#61; null){currNode.left &#61; new TreeNode(0);}currNode &#61; currNode.left;}else {if(currNode.right &#61;&#61; null){currNode.right &#61; new TreeNode(1);}currNode &#61; currNode.right;}}// finished for nums[i], will do it for nums[i&#43;&#43;];currNode &#61; root;}//find max xor valueint maxXOR &#61; 0;for (int i &#61; 0; i &#61;0; j--) {int tmp &#61; (nums[i] >>j)& 1;if(currNode.left !&#61; null && currNode.right !&#61; null){if(tmp &#61;&#61; 0){currNode &#61; currNode.right;}else {currNode &#61; currNode.left;}}else {currNode &#61; currNode.left &#61;&#61; null ? currNode.right : currNode.left;}res &#43;&#61; (tmp^currNode.val) < res ? maxXOR : res;}return maxXOR;}private int findMax(int[] nums){int max &#61; nums[0];for (int i &#61; 1; i max){max &#61; nums[i];}}return max;}private static class TreeNode{int val;TreeNode left,right;TreeNode(int val){this.val &#61; val;}}
}

Bit maniputaipon
这个解法也是利用前缀树的思想&#xff0c;利用Map保存下一次遍历的前缀。&#xff08;空间换时间&#xff09;
贪心思想&#xff0c;从最大的bit到最小的bit组装最大异或值。
借用一段解释&#xff1a;
I think most people who find it hard to understand the code is stuck on this line if(set.contains(tmp ^ prefix))
The tricky part here is that we need to be aware of a key property of XOR applying on the above line: if A ^ B &#61; C, then A ^ B ^ B &#61; C ^ B, then A &#61; C ^ B
Before executing that line, max stands for the maximum we can get if we consider only the most significant i - 1 bits, tmp stands for the potential max value we can get when considering the most significant i bits. How can we get this tmp? The only way we can get this value is that we have two values A and B in the set (a set of most significant i bits of each member), such that A ^ B equals to tmp. As mentioned earlier, A ^ B &#61; tmp is equivalent to A &#61; tmp ^ B. Here is where that line comes in: set.contains(tmp ^ B).

public class Solution {public int findMaximumXOR(int[] nums) {int max &#61; 0, mask &#61; 0;for(int i &#61; 31; i >&#61; 0; i--){mask &#61; mask | (1 < set &#61; new HashSet<>();for(int num : nums){set.add(num & mask);}int tmp &#61; max | (1 <}

推荐阅读
  • 本文介绍了如何在Linux系统中获取库源码,并在从源代码编译软件时收集所需的依赖项列表。 ... [详细]
  • 在Effective Java第三版中,建议在方法返回类型中优先考虑使用Collection而非Stream,以提高代码的灵活性和兼容性。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 本文档详细介绍了软通动力Java开发工程师职位的笔试题目,涵盖了Java基础、集合框架、JDBC、JSP等内容,并提供了详细的答案解析。 ... [详细]
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文详细介绍了HashSet类,它是Set接口的一个实现,底层使用哈希表(实际上是HashMap实例)。HashSet不保证元素的迭代顺序,并且是非线程安全的。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • 探讨了在HTML表单中使用元素代替进行表单提交的方法。 ... [详细]
  • 本教程介绍如何在C#中通过递归方法将具有父子关系的列表转换为树形结构。我们将详细探讨如何处理字符串类型的键值,并提供一个实用的示例。 ... [详细]
  • C# 中创建和执行存储过程的方法
    本文详细介绍了如何使用 C# 创建和调用 SQL Server 存储过程,包括连接数据库、定义命令类型、设置参数等步骤。 ... [详细]
  • 机器学习(ML)三之多层感知机
    深度学习主要关注多层模型,现在以多层感知机(multilayerperceptron,MLP)为例,介绍多层神经网络的概念。隐藏层多层感知机在单层神经网络的基础上引入了一到多个隐藏 ... [详细]
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
  • 本文介绍了如何使用 VBScript 脚本在 IE7 上安装 Windows 序列号的方法。对于使用超级解霸的用户,如果遇到 .vbs 文件无法正常运行的问题,文中也提供了相应的解决办法。 ... [详细]
  • php三角形面积,335宝石大全
    php三角形面积,335宝石大全 ... [详细]
author-avatar
christinezzy850
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有