leetcode421. 数组中两个数的最大异或值(贪心算法)

给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n 。

进阶:你可以在 O(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的两个数就是能产生最大结果的两个数,例如:

  • 0011 0000
  • 0000 0000
  • 0010 0000

因为0000 0000 和 0011 0000异或,能产生一个高位的1 和 次高位的1,而0000 0000和 0010 0000 异或只能产生一个高位的1,所以优先选择第一种方案。

代码

func findMaximumXOR(nums []int)(res int)  {

	const  hb = 30
    res=0
	for i := hb; i >=0 ; i-- {
//移除30位,因为都是在正数的范围内,所以第31位就是最高位
//也就是说最外层循环是遍历31种情况
//从移除30位到全部位数都保留的31种情况
		seen :=map[int]bool{}
		for _, num := range nums {
			seen[num>>i]=true
		}
//移除特定位数以后的值保留在map里面
        cur:=res*2+1
//将上一步计算出来的结果值左移一位,再加1
//因为上一步的结果是高位的结果,所以需要左移
//为什么要加1?就是假设当前遍历到的位可以出现01异或这种情况,就产生低位的1,因为a^b=c 等价于 a^c=b
//则有a^b=cur 等价于a^cur=b,这就是if seen[(num>>i)^cur]进行的判断

//我们将假设的结果与所有的值进行异或运算,如果map中存在这个异或的结果,就说明数组中有两个数字是可以在当前位进行异或得到1的
//如果找到了,就说明我们假设的结果是正确的,否则就是当前位只能是0,所以需要减去1
        found:=false
		for _, num := range nums {
			if seen[(num>>i)^cur]{
				found=true
				break
			}
		}
		if found{
			res=cur
		}else{
			res=cur-1
		}

	}
    return
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值