热门标签 | 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 <}

推荐阅读
  • 探讨ChatGPT在法律和版权方面的潜在风险及影响,分析其作为内容创造工具的合法性和合规性。 ... [详细]
  • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
  • 本题探讨了在一个有向图中,如何根据特定规则将城市划分为若干个区域,使得每个区域内的城市之间能够相互到达,并且划分的区域数量最少。题目提供了时间限制和内存限制,要求在给定的城市和道路信息下,计算出最少需要划分的区域数量。 ... [详细]
  • 在软件开发过程中,MD5加密是一种常见的数据保护手段。本文将详细介绍如何在C#中使用两种不同的方式来实现MD5加密:字符串加密和流加密。 ... [详细]
  • 本文探讨了在C++中如何有效地清空输入缓冲区,确保程序只处理最近的输入并丢弃多余的输入。我们将介绍一种不阻塞的方法,并提供一个具体的实现方案。 ... [详细]
  • 配置多VLAN环境下的透明SQUID代理
    本文介绍如何在包含多个VLAN的网络环境中配置SQUID作为透明网关。网络拓扑包括Cisco 3750交换机、PANABIT防火墙和SQUID服务器,所有设备均部署在ESXi虚拟化平台上。 ... [详细]
  • 反向投影技术主要用于在大型输入图像中定位特定的小型模板图像。通过直方图对比,它能够识别出最匹配的区域或点,从而确定模板图像在输入图像中的位置。 ... [详细]
  • 本题探讨了在大数据结构背景下,如何通过整体二分和CDQ分治等高级算法优化处理复杂的时间序列问题。题目设定包括节点数量、查询次数和权重限制,并详细分析了解决方案中的关键步骤。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 由二叉树到贪心算法
    二叉树很重要树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。单就面试而言,在 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • 深入解析Java多线程与并发库的应用:空中网实习生面试题详解
    本文详细探讨了Java多线程与并发库的高级应用,结合空中网在挑选实习生时的面试题目,深入分析了相关技术要点和实现细节。文章通过具体的代码示例展示了如何使用Semaphore和SynchronousQueue来管理线程同步和任务调度。 ... [详细]
  • 本文详细介绍了Linux内核中misc设备驱动框架的实现原理及应用方法,包括misc设备的基本概念、驱动框架的初始化过程、数据结构分析以及设备的注册与注销流程。 ... [详细]
  • Java 架构:深入理解 JDK 动态代理机制
    代理模式是 Java 中常用的设计模式之一,其核心在于代理类与委托类共享相同的接口。代理类主要用于为委托类提供预处理、过滤、转发及后处理等功能,以增强或改变原有功能的行为。 ... [详细]
  • 本文介绍了如何通过Java代码计算一个整数的位数,并展示了多个基础编程示例,包括求和、平均分计算、条件判断等。 ... [详细]
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社区 版权所有