直接說這道題時間複雜度o(n)的做法,構建字首樹。假設將0-0、0-1、0-2、…、0-i-1的異或結果全部裝在字首樹中,那麼以i結尾的最大異或和就是0到某一位置x的異或結果和i異或結果最大,舉個例子,假設x是3,0-3的異或結果和i進行異或得到的結果最大,那麼就說明4-i的異或結果是最大的。
但是如何知道x到底是多少,換句話說,0-x中哪個值和i進行異或得到的結果最大。其實這個也比較好想,假設i是0100(最高位0是符號位),只需要沿著字首樹找到0011,異或出來的結果就是0111,一定就是最大的,如果不能剛好找到合適的,那就有什麼選什麼,只要保證從最高位開始往下每次的決策是最優的就行
有一種特殊情況,假設i還是0100,但是此時字首樹中最高位只有1,沒有0,那麼最高位得出的異或結果永遠是負數,後面的位應該如何選?其實也是按照最優決策去選,假設異或結果是1111,那麼轉換為十進位制就是-1,絕對沒有比這還大的負數了
public
class
main
public
static
class
numtrie
}public
intmaxxor
(int num)
return res;}}
public
static
intmaxxorsubarray
(int
arr)
return max;
}}
子陣列的最大異或和
子陣列的最大異或和 陣列異或和的定義 把陣列中所有的數異或起來得到的值。給定乙個整型陣列arr,其中可能有正 有負,有零,求其中子陣列的最大異或和。輸入描述 輸出包含兩行,第一行乙個整數n 1 n 1 05 n 1 leq n leq 10 5 n 1 n 105 代表陣列arr長度,第二個n個整數...
LC 陣列中兩個數的最大異或值
根據圖進行理解 題目中說到最大數小於2的31次方,所以for迴圈31次即可 先確定高位,再確定低位 貪心演算法 才能保證這道題的性質 1位接著1位去確定這個數的大小 主要思路 構造具備公共字首的字典樹,每次遍歷數字,如果當前數字高位為1時,判斷是否存在0的支路 如果當前數字低位數字為0時,判斷當前是...
421 陣列中兩個數的最大異或值
標籤 位運算 字典樹。題目 給你乙個整數陣列 nums 返回 nums i xor nums j 的最大運算結果,其中 0 i j n 高階 你可以在 o n 的時間解決這個問題嗎?輸入 nums 3 10,5 25,2 8 輸出 28 解釋 最大運算結果是 5 xor 25 28.輸入 nums ...