[Swift]LeetCode421. 数组中两个数的最大异或值 | Maximum XOR of Two Numbers in an Array
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:为敢(WeiGanTechnologies)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10333729.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
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.
给定一个非空数组,数组中元素为 a0, a1, a2, … , an-1,其中 0 ≤ ai < 231 。
找到 ai 和aj 最大的异或 (XOR) 运算结果,其中0 ≤ i, j < n 。
你能在O(n)的时间解决这个问题吗?
示例:
输入: [3, 10, 5, 25, 2, 8] 输出: 28 解释: 最大的结果是 5 ^ 25 = 28.
196ms
1 class Solution { 2 func findMaximumXOR(_ nums: [Int]) -> Int { 3 var res:Int = 0 4 var mask:Int = 0 5 for i in (0...31).reversed() 6 { 7 mask |= (1 << i) 8 var s:Set<Int> = Set<Int>() 9 for num in nums 10 { 11 s.insert(num & mask) 12 } 13 var t:Int = res | (1 << i) 14 for prefix in s 15 { 16 if s.contains(t ^ prefix) 17 { 18 res = t 19 break 20 } 21 } 22 } 23 return res 24 } 25 }
872ms
1 class TrieNode { 2 var children = [Int: TrieNode]() 3 var end: Bool 4 var value: Int = -1 5 6 init() { 7 end = false 8 } 9 10 func hasChild(_ key: Int) -> Bool { 11 return children[key] != nil 12 } 13 14 func makeChild(_ key: Int) { 15 children[key] = TrieNode() 16 } 17 18 func getChild(_ key: Int) -> TrieNode { 19 return children[key]! 20 } 21 } 22 23 24 class Solution { 25 26 let INT_SIZE = 32 27 var root = TrieNode() 28 29 func findMaximumXOR(_ nums: [Int]) -> Int { 30 31 var ans = 0 32 insert(nums[0]) 33 34 for i in 1..<nums.count { 35 ans = max(ans, query(nums[i])) 36 insert(nums[i]) 37 } 38 39 return ans 40 41 } 42 43 func query(_ key: Int) -> Int { 44 var current = root 45 46 for i in (0..<INT_SIZE).reversed() { 47 let current_bit = (key & 1<<i) >= 1 ? 1 : 0 48 let next: TrieNode? 49 if current.hasChild(1-current_bit) { 50 next = current.getChild(1-current_bit) 51 } else { 52 next = current.getChild(current_bit) 53 } 54 55 current = next! 56 } 57 58 return key ^ current.value 59 60 } 61 62 func insert(_ num: Int) { 63 64 var current = root 65 66 for i in (0..<INT_SIZE).reversed() { 67 let key = (num & 1<<i) >= 1 ? 1 : 0 68 if !current.hasChild(key) { 69 current.makeChild(key) 70 } 71 72 current = current.getChild(key) 73 } 74 75 current.end = true 76 current.value = num 77 } 78 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了