Leetcode[421] Maximum XOR of Two Numbers in an Array

weixin_33807284發表於2016-10-26

LeetCode[421] 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.

BitSet+HashSet

複雜度
O(N), O(N)

思路
利用XOR的性質,a^b = c, 則有 a^c = b,且 b^c = a;
所以每次從高位開始,到某一位為止,所能獲得的最大的數。設定變數mask用來表示能形成的值,每一次將mask和其他的num相與得到的值加入set,表示在當前這一位上,陣列裡有這麼多prefix。

假定在某一位上的任意兩數xor能得到的最大值是tmp,那麼他一定滿足a(xor)b = tmp,其中set.contains(a) && set.contains(b). 所以,我們只需要判斷b(xor)tmp的結果是不是在當前這一位下的set內,就可以知道這個tmp能不能又這個set中的任意兩個陣列成。

程式碼

    public int findMaximumXOR(int[] nums) {
        int max = 0, mask = 0;
        // test each bit pose, 判斷能不能構成所需要的值;
        for(int i = 31; i >= 0; i --) {
            // 每次都在之前的基礎上更新mask
            mask = mask | (1 << i);
            Set<Integer> set = new HashSet<>();
            for(int num : nums) {
                // add the number which has the mask as its prefix;
                set.add(num & mask);
            }
            // 假設當前所能達到的最大值是這個temp值;
            int tmp = max | (1 << i);
            for(Integer prefix : set) {
                if(set.contains(prefix ^ tmp)) {
                    // 如果能組成就直接break 
                    max = tmp;
                    break;
                }
            }
        }
        return max;
    }

相關文章