給定乙個陣列,求子陣列的最大異或和。乙個陣列的異或和為陣列中所有的數異或起來的結果。
之前做個乙個找到異或和為0的最長子陣列,思路是將每乙個節點當做異或和的最後乙個節點,求解最長的子陣列。同樣這個題目可以以這種方法解決。以i位置結尾的最大異或和的值,最大的異或和一定包含在其中。
暴力解法就是從0-i,1-i,2-i。。。進行遍歷,求解出以i為末尾的最大異或和的值,不斷遍歷,求出最後的結果。
精簡思路:
準備輔助陣列dp,每乙個位置在算完之後結果都儲存在陣列中,將當前arr【i】和0-start-1的異或結果異或,此時可以少一遍迴圈,就可以計算出start到i的異或結果。
字首樹思路:
將每一次從0到i異或的結果的二進位制序列扔到字首樹中,形成一顆字首樹,當新的i出現,此時希望將異或結果求最大,則首位還是希望為0,此時符號位為正數。
首位確定好之後,則下面的路希望盡量選1,此時數值盡量大,所以資料位需要與0-i異或結果盡量相反,求解最大。
其實字首樹思路是在第二種思路上進行的改進,利用兩個前k項異或求出最大的異或結果
暴力解**
public
static
intgetmaxe
(int
arr)
max = math.
max(max,res);}
}return max;
}
public
static
intgetmaxe2
(int
arr)
dp[i]
= eor;
}return max;
字首樹:
public
static
class
node
public
static
class
numtrie
}public
intmaxxor
(int num)
return res;}}
public
static
intmaxxorsubarray
(int
arr)
int max = integer.min_value;
int eor =0;
numtrie numtrie =
newnumtrie()
;//此時為乙個黑盒
numtrie.
add(0)
;for
(int i =
0; i)return max;
}
左神演算法初級班筆記6 字首樹 貪心
arr2中有哪些字元,是作為arr1中某個字串字首出現的?請 列印 arr2中有哪些字元,是作為arr1中某個字串字首出現的?請列印 arr2 現次數最大的字首。不要企圖證明貪心的正確性,想幾個貪心策略之後,用對數器去證明正確的即可。1.按最低字典序拼接字串給定乙個字串型別的陣列strs,找到一種拼...
左神演算法講堂筆記 05 樹
非遞迴遍歷有點難,目前只能讀懂 裡面的精髓還未真正參透。先序遍歷 不斷地把根入棧,再取出來輸出 根左右,那麼先入棧的肯定是根,要保證輸出左子樹,再輸出右子樹,那麼就要先入棧右子樹。void preorderunrecur node head if node.left null 中序遍歷 必須左子樹走...
左神演算法筆記01
對數器異或工具 一些其它的位運算子的操作 簡單理解為 將乙個演算法的所有操作拆成基本操作 常數時間完成的操作 後,計算出操作次數和操作時間 可視為1 的乘積,即操作次數之和。在考慮最差情況時用o 來表示時間複雜度,取最高項來表示。如o n o logn 對n個數進行排列,則最差要進行1 2 3 n ...