• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
neverlandly
博客园    首页    新随笔    联系   管理    订阅  订阅

Leetcode: 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 < n.

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 = 28.

Solution 1: Bit Manipulation:

这题真心有点难,get the max XOR bit by bit

note that if A^B=C, then A^C=B, B^C=A

 1 public class Solution {
 2     public int findMaximumXOR(int[] nums) {
 3         int mask = 0, max = 0;
 4         for (int i=31; i>=0; i--) {
 5             mask |= 1<<i;
 6             HashSet<Integer> prefixes = new HashSet<Integer>();
 7             for (int each : nums) {
 8                 prefixes.add(each & mask); // reserve Left bits and ignore Right bits
 9             }
10             int tmpMax = max | (1<<i);   
11             //possible new max, for example: max right now is 11000, then tmpMax=11100, max is 11100, tmpMax is 11110
12             for (int prefix : prefixes) {
13                 if (prefixes.contains(tmpMax^prefix)) 
14                     max = tmpMax;
15             }
16         }
17         return max;
18     }
19 }        

Solution 2: Trie, (未研究)

https://discuss.leetcode.com/topic/63207/java-o-n-solution-using-trie

https://discuss.leetcode.com/topic/64753/31ms-o-n-java-solution-using-trie

posted @ 2016-12-05 07:48  neverlandly  阅读(552)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3