每天一道力扣题:数组中两个数的最大异或值
作者:互联网
业精于勤,荒于嬉; 行成于思,毁于随。
题干
给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n 。
示例1:
输入:nums = [3,10,5,25,2,8]
输出:28
解释:最大运算结果是 5 XOR 25 = 28.
示例2:
输入:nums = [0]
输出:0
示例3:
输入:nums = [2,4]
输出:6
示例4:
输入:nums = [8,10,2]
输出:10
示例5:
输入:nums = [14,70,53,83,49,91,36,80,92,51,66,70]
输出:127
- 1 <= nums.length <= 2 * 104
- 0 <= nums[i] <= 231 - 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-xor-of-two-numbers-in-an-array/
思路
前提:二进制下,希望一个数尽可能大,即希望越高位上越能够出现“1”,这样这个数就是所求的最大数,这是贪心算法的思想。即我们选择的两个数异或要尽可能让高位为1。
!!!核心:尽可能多的高位为1。
- 先假设最大值高位为1,然后取出nums中数据的高位(即屏蔽低位后放入字典d中)
- 如果有1^0这种组合,即可说明该位可以为1
- 然后看结果的次高位是否能为1。
- 屏蔽nums中的数据的除高2位的位数,加入d中。
- 然后在d中寻找是否有组合能够使高位和次高位都为1.如果没有,说明次高位只能是0。寻找组合的方法:当前数异或上待定最大值应该为我们查找的能形成最大值组合的那个数。
- 重复上一步
题解
代码
class Solution:
def findMaximumXOR(self, nums: List[int]) -> int:
res = 0
max_len = len(bin(max(nums))) - 2
for i in range(max_len - 1, -1, -1):
cur = 1 << i
res |= cur
d = {}
find = 0
for num in nums:
d[num & res] = 1
if (num & res) ^ res in d:
find = 1
break
if not find:
res ^= 1 << i
return res
结果统计
标签:高位,示例,res,nums,力扣题,异或,num,数组 来源: https://blog.csdn.net/I_am_Tony_Stark/article/details/116891094