日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 421. 数组中两个数的最大异或值

發(fā)布時(shí)間:2024/5/17 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 421. 数组中两个数的最大异或值 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

421. 數(shù)組中兩個(gè)數(shù)的最大異或值

Idea

假設(shè)選擇了數(shù)組中的元素ai和aj使得它們達(dá)到最大按位異或結(jié)果x:x=ai⊕ajx=a_{i}⊕a_{j}x=ai?aj?,其中⊕表示按位異或運(yùn)算。

根據(jù)異或運(yùn)算的性質(zhì),x=ai⊕ajx=a_{i}⊕a_{j}x=ai?aj?等價(jià)于aj=ai⊕xa_{j}=a_{i}⊕xaj?=ai?x,根據(jù)這一變換,可以設(shè)計(jì)一種[從高位到低位依次確定x二進(jìn)制表示的每一位]的方法,以此得到x的值。

數(shù)組中的元素都在[0, 231)的范圍內(nèi),可以將每一個(gè)數(shù)都表示為一個(gè)長度為31位的二進(jìn)制數(shù)(不滿31位補(bǔ)前導(dǎo)0)字符串,然后可以從最高位第30個(gè)二進(jìn)制位開始依次確定x的每一位是0還是1。

由于需要找出最大的x,因此在枚舉每一位時(shí),需要先判斷x的這一位是否能取到1,如果能,就取這一位為1,否則取這一位為0。

將字符串放入字典樹中,那么在字符串中查詢一個(gè)字符串的過程,就是從高位開始確定每一個(gè)二進(jìn)制位的過程。

x=ai⊕ajx=a_{i}⊕a_{j}x=ai?aj?,枚舉ai,將a0, a1, …, ai-1作為aj放入字典樹,希望找到使得x達(dá)到最大值的aj

從字典樹的根節(jié)點(diǎn)開始進(jìn)行遍歷,遍歷的[參照對(duì)象]為ai,根據(jù)ai的第x個(gè)二進(jìn)制位時(shí)0還是1確定應(yīng)該走哪個(gè)子節(jié)點(diǎn)。

假設(shè)當(dāng)前遍歷到第k個(gè)二進(jìn)制位:

  • 如果ai的第k個(gè)二進(jìn)制位為0,那么應(yīng)該往表示1的子節(jié)點(diǎn)走。如果不存在表示1的子節(jié)點(diǎn),就只能往表示0的子節(jié)點(diǎn)走。
  • 如果ai的第k個(gè)二進(jìn)制位為1,那么應(yīng)該往表示0的子節(jié)點(diǎn)走。如果不存在表示0的子節(jié)點(diǎn),就只能往表示1的子節(jié)點(diǎn)走。

遍歷完所有的31個(gè)二進(jìn)制位后,得到ai可以通過異或運(yùn)算得到的最大x。

Code

Python

from typing import Listclass Trie:def __init__(self):self.left, self.right = None, Noneclass Solution:def findMaximumXOR(self, nums: List[int]) -> int:root = Trie()HIGH_BIT = 30def add(num: int) -> None:cur = rootfor k in range(HIGH_BIT, -1, -1):bit = (num >> k) & 1if bit == 0:if not cur.left:cur.left = Trie()cur = cur.leftelse:if not cur.right:cur.right = Trie()cur = cur.rightdef check(num: int) -> int:cur = rootx = 0for k in range(HIGH_BIT, -1, -1):bit = (num >> k) & 1if bit == 0:if cur.right:cur = cur.rightx = x * 2 + 1else:cur = cur.leftx = x * 2else:if cur.left:cur = cur.leftx = x * 2 + 1else:cur = cur.rightx = x * 2return xn, x = len(nums), 0for i in range(1, n):add(nums[i - 1])x = max(x, check(nums[i]))return x

總結(jié)

以上是生活随笔為你收集整理的LeetCode 421. 数组中两个数的最大异或值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。