当前位置: 首页 > article >正文

Golang | Leetcode Golang题解之第421题数组中两个数的最大异或值

题目:

题解:

const highBit = 30

type trie struct {
    left, right *trie
}

func (t *trie) add(num int) {
    cur := t
    for i := highBit; i >= 0; i-- {
        bit := num >> i & 1
        if bit == 0 {
            if cur.left == nil {
                cur.left = &trie{}
            }
            cur = cur.left
        } else {
            if cur.right == nil {
                cur.right = &trie{}
            }
            cur = cur.right
        }
    }
}

func (t *trie) check(num int) (x int) {
    cur := t
    for i := highBit; i >= 0; i-- {
        bit := num >> i & 1
        if bit == 0 {
            // a_i 的第 k 个二进制位为 0,应当往表示 1 的子节点 right 走
            if cur.right != nil {
                cur = cur.right
                x = x*2 + 1
            } else {
                cur = cur.left
                x = x * 2
            }
        } else {
            // a_i 的第 k 个二进制位为 1,应当往表示 0 的子节点 left 走
            if cur.left != nil {
                cur = cur.left
                x = x*2 + 1
            } else {
                cur = cur.right
                x = x * 2
            }
        }
    }
    return
}

func findMaximumXOR(nums []int) (x int) {
    root := &trie{}
    for i := 1; i < len(nums); i++ {
        // 将 nums[i-1] 放入字典树,此时 nums[0 .. i-1] 都在字典树中
        root.add(nums[i-1])
        // 将 nums[i] 看作 ai,找出最大的 x 更新答案
        x = max(x, root.check(nums[i]))
    }
    return
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

http://www.kler.cn/a/320744.html

相关文章:

  • Python 网络爬虫入门教程
  • 红外遥控信号解码
  • python机器人Agent编程——多Agent框架的底层逻辑(上)
  • html + css 自适应首页布局案例
  • 群控系统服务端开发模式-应用开发-前端图片格式功能开发
  • 数据研发基础 | 什么是流批一体
  • 嵌入式硬件工程师与嵌入式软件工程师的区别(详细版)
  • 关于 ReentrantLock 中锁 lock() 和解锁 unlock() 的底层原理浅析
  • OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【文件系统】上
  • NLP 序列标注任务核心梳理
  • 《C++中的神秘利器——类型萃取(Type Traits)深度解析》
  • Android ImageView支持每个角的不同半径
  • LVS-DR实战案例,实现四层负载均衡
  • 利用探空站数据(怀俄明和IGRA)和ERA5计算ZTD、ZHD和ZWD
  • 什么是 IP 地址信誉?5 种改进方法
  • 广播IP与共享IP的关系
  • hadoop大数据平台操作笔记(下)
  • C++/Qt 集成 AutoHotkey
  • 这本书简直就是自然语言处理学习者的福音!
  • 408算法题leetcode--第14天
  • Git 版本控制--git restore和git reset
  • 大数据Flink(一百二十三):五分钟上手Flink MySQL连接器
  • SQLServer TOP(Transact-SQL)
  • 【C++类的设计】题目(二):设计圆柱Column类
  • 【NLP】循环神经网络--RNN学习.day3
  • Rust编程的if选择语句