Skip to content

Commit e3fcebc

Browse files
authored
Update README.md
1 parent f1f9361 commit e3fcebc

File tree

1 file changed

+9
-10
lines changed
  • solution/0421.Maximum XOR of Two Numbers in an Array

1 file changed

+9
-10
lines changed

‎solution/0421.Maximum XOR of Two Numbers in an Array/README.md

+9-10
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,28 @@
11
## 数组中两个数的最大异或值
22
### 题目描述
33

4-
给定一个非空数组,数组中元素为 a0, a1, a2, … , an-1,其中 0 ≤ ai < 231 
4+
给定一个非空数组,数组中元素为 a0, a1, a2, … , an-1,其中 0 ≤ ai < 2<sup>31</sup>
55

6-
找到 ai 和aj 最大的异或 (XOR) 运算结果,其中0 ≤ i,  j < n 
6+
找到 ai 和aj 最大的异或 (XOR) 运算结果,其中0 ≤ i, j < n
77

8-
示例:
8+
**示例:**
99
```
1010
输入: [3, 10, 5, 25, 2, 8]
11-
1211
输出: 28
13-
1412
解释: 最大的结果是 5 ^ 25 = 28.
1513
```
1614

1715
### 解法
1816
异或运算被称为不做进位的二进制加法运算, 且具有一个性质:如果 a ^ b = c 成立,那么a ^ c = b 与 b ^ c = a 均成立。
19-
再分析一下题目, 要在数组中找到两个数对他们进行异或运算后得到一个最大的异或值, 即这个异或值二进制表示非0最高位要尽可能的靠左同时剩余位尽可能为1;
20-
整体使用贪心原则, 依次假设整数从左至右第i为1, 然后再使用一个mask与数组中所有数相与得到数据前i位的一个前缀集合, 再把之前一次i-1循环所得到的max加第i位
21-
为1得到当前i循环中期望的pre-max, 再与前缀集合中的所有数进行异或运算, 如果得到的值也同时在集合中, 表示假设成立, max变为pre-max, 否则直接i+1进行下一个
22-
循环, 直到i=0算法结束;
17+
18+
分析一下题目, 要在数组中找到两个数对他们进行异或运算后得到一个最大的异或值, 即这个异或值二进制表示非 0 最高位要尽可能的靠左同时剩余位尽可能为 1;
19+
20+
整体使用贪心原则, 依次假设整数从左至右第 i 为 1, 然后再使用一个 mask 与数组中所有数相与得到数据前 i 位的一个前缀集合, 再把之前一次 `i-1` 循环所得到的 max 加第 i 位
21+
为 1 得到当前 i 循环中期望的 `pre-max`, 再与前缀集合中的所有数进行异或运算, 如果得到的值也同时在集合中, 表示假设成立, `max` 变为 `pre-max`, 否则直接`i+1`进行下一个
22+
循环, 直到 `i=0` 算法结束。
2323

2424
```java
2525
class Solution {
26-
2726
public int findMaximumXOR(int[] numbers) {
2827
int max = 0;
2928
int mask = 0;

0 commit comments

Comments
 (0)