LeetCode 🟢 1863. Sum of All Subset XOR Totals
🔗 🟢 1863. Sum of All Subset XOR Totals 1372
tags: Weekly Contest 241
暴力法(Brute Force)
回溯(Backtracking)
位運算(Bit Manipulation)
狀態壓縮
數學(Math)
雖然是 Easy 題,但 的解法可不簡單。
題意
一個陣列的 異或總和(XOR Total) 定義為陣列中所有元素按位 XOR
的結果,如果陣列為 空 ,則異或總和為 0
。
給定一個陣列 ,請你求出 中每個 子集 的 異或總和 ,計算並返回這些值相加之 和 。
限制
思路
方法一:暴力法(Brute Force) + 回溯(Backtracking) / 狀態壓縮
暴力枚舉所有子集,計算每個子集的 XOR 和。比較直覺的方法是可以用回溯法來實現,但可以注意到陣列的長度最多只有 ,而每個元素都只有在或不在子集中兩種狀態,所以可以把每個元素的狀態用二進位表示,這樣就可以用一個長度為 的二進位數來表示一個子集,並且將枚舉子集轉換成枚舉數字,這就是 狀態壓縮 。
直接枚舉 之間的所有數字,對於每個數字,對應的二進位數中的每一位,如果該位是 1,則將對應的元素異或到當前子集的 XOR 和中,最後將當前子集的 XOR 和加到答案中即可。此外,由於空子集的 XOR 和為 0,所以其實可以從 開始枚舉。
複雜度分析
- 時間複雜度: ,枚舉所有子集需要 的時間,對於每個子集,需要 的時間計算 XOR 和。
- 空間複雜度: 。
1 | class Solution: |
1 | class Solution { |
方法二:數學(Math) + 位運算(Bit Manipulation)
由於 XOR 是按位運算,所以可以 按位考慮 每個子集中該位 的個數。
- 若該子集中該位 的個數為 奇數 ,則該位的 XOR 值為
- 若該子集中該位 的個數為 偶數 ,則該位的 XOR 值為
接著從元素中該位的值來考慮所有子集中該位的 XOR 和,可以得到以下結論:
- 若所有元素中的該位皆為 ,則在所有 個子集中,該位的 XOR 和顯然為
- 若至少有一個元素中的該位為 ,則總共有 個子集中該位 的個數為奇數、 個子集中該位 的個數為偶數。
結論 2. 的證明如下:
- 假設陣列中該位為 的元素個數為 ,那麼子集中包含 個 的個數為 :
- 包含奇數個 的子集數量為:
- 包含偶數個 的子集數量為:
- 包含奇數個 的子集數量為:
- 可以得出包含奇數個 的子集數量和包含偶數個 的子集數量相等,故兩者皆為 。
若所有元素的第 位中至少有一個元素的該位為 ,則該位對答案的貢獻為 ,所以只要判斷在所有元素中是否有一個元素的該位為 ,就能計算對答案的貢獻。可以計算所有元素的 OR 值,最後乘上 ,也就是左移 位即可。
複雜度分析
- 時間複雜度: ,計算所有元素的 OR 值需要 的時間。
- 空間複雜度: 。
1 | class Solution: |
1 | class Solution { |
寫在最後
Cover photo is generated by @たろたろ, thanks for their work!
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 十六個天亮!
評論
WalineGiscus