題目要求
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;
}