leetcode421. 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.

現有一個非空的整數數組,問如何能夠找出整數數組中兩個整數的異或結果的最大值。

思路和代碼

這裏解釋一下高分答案貪婪算法的思路。每一次我們都試圖假設第i位的異或結果爲1,並且判斷是否能夠從數組中找到任意兩個整數,其在該位上的異或值爲1。如果找不到,則說明任意兩個整數在該位的異或結果只能是0。接着對第i-1位進行同樣的判斷。從高位開始的原因在於,從貪婪角度的算法看來,我們更希望高位爲1,其生成的異或值更大。

代碼如下:

    public int findMaximumXOR(int[] nums) {
        //32位到第i位爲止算出的異或最大值
        int maxResult = 0;
        int mask = 0;
        for(int i = 31 ; i>=0 ; i--) {
            //i~32位全爲1
            mask |= (1 << i);
            Set<Integer> set = new HashSet<>();
            //取所有整數的前32-i位的結果並保存
            for(int num : nums) {
                set.add(num | mask);
            }
            
            //假設第i位能夠異或出結果1
            int greedyTry = maxResult | (1 << i);
            //使用結論a^b=c,則a^c=b。根據該結論,我們假設整數數組中的兩個整數在第i爲的值爲1,且set中存儲了所有的a的值,異或出b的值後看b是否也在set中。
            for(int num : set) {
                if(set.contains(greedyTry ^ num)) {
                    maxResult = greedyTry;
                    break;
                }
            }
        }
        return maxResult;

    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章